free-listt (empty) → 0.1.0.0
raw patch · 6 files changed
+264/−0 lines, 6 filesdep +basedep +exceptionsdep +free
Dependencies added: base, exceptions, free, free-listt, mtl, transformers
Files
- CHANGELOG.md +5/−0
- LICENSE +20/−0
- free-listt.cabal +143/−0
- src/Control/Applicative/Trans/List.hs +17/−0
- src/Control/Monad/Trans/List.hs +73/−0
- test/Main.hs +6/−0
+ CHANGELOG.md view
@@ -0,0 +1,5 @@+# Revision history for free-listt++## 0.1.0.0 -- YYYY-mm-dd++* First version. Released on an unsuspecting world.
+ LICENSE view
@@ -0,0 +1,20 @@+Copyright (c) 2023 Manuel Bärenz++Permission is hereby granted, free of charge, to any person obtaining+a copy of this software and associated documentation files (the+"Software"), to deal in the Software without restriction, including+without limitation the rights to use, copy, modify, merge, publish,+distribute, sublicense, and/or sell copies of the Software, and to+permit persons to whom the Software is furnished to do so, subject to+the following conditions:++The above copyright notice and this permission notice shall be included+in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ free-listt.cabal view
@@ -0,0 +1,143 @@+cabal-version: 3.0+-- The cabal-version field refers to the version of the .cabal specification,+-- and can be different from the cabal-install (the tool) version and the+-- Cabal (the library) version you are using. As such, the Cabal (the library)+-- version used must be equal or greater than the version stated in this field.+-- Starting from the specification version 2.2, the cabal-version field must be+-- the first thing in the cabal file.++-- Initial package description 'free-listt' generated by+-- 'cabal init'. For further documentation, see:+-- http://haskell.org/cabal/users-guide/+--+-- The name of the package.+name: free-listt++-- The package version.+-- See the Haskell package versioning policy (PVP) for standards+-- guiding when and how versions should be incremented.+-- https://pvp.haskell.org+-- PVP summary: +-+------- breaking API changes+-- | | +----- non-breaking API additions+-- | | | +--- code changes with no API change+version: 0.1.0.0++-- A short (one-line) description of the package.+synopsis: Lawful list and set monad transformers based on free monads++-- A longer description of the package.+description:+ This package provides a lawful @ListT@ implementation based on free monads.+ It also provides an _Applicative_ list transformer, which is a lawful @Applicative@,+ and isomorphic to the old @ListT@.+++-- The license under which the package is released.+license: MIT++-- The file containing the license text.+license-file: LICENSE++-- The package author(s).+author: Manuel Bärenz++-- An email address to which users can send suggestions, bug reports, and patches.+maintainer: programming@manuelbaerenz.de++-- A copyright notice.+-- copyright:+category: Control+build-type: Simple++-- Extra doc files to be distributed with the package, such as a CHANGELOG or a README.+extra-doc-files: CHANGELOG.md++-- Extra source files to be distributed with the package, such as examples, or a tutorial module.+-- extra-source-files:++tested-with:+ GHC == 8.10.7+ GHC == 9.0.2+ GHC == 9.2.8+ GHC == 9.4.8+ GHC == 9.6.3+ GHC == 9.8.1++source-repository head+ type: git+ location: https://github.com/turion/free-listt.git++common warnings+ ghc-options: -Wall++library+ -- Import common warning flags.+ import: warnings++ -- Modules exported by the library.+ exposed-modules:+ Control.Applicative.Trans.List+ Control.Monad.Trans.List++ -- Modules included in this library but not exported.+ other-modules:++ default-extensions:+ ApplicativeDo,+ DeriveFunctor,+ DerivingStrategies,+ DerivingVia,+ ImportQualifiedPost,+ GeneralizedNewtypeDeriving,+ TupleSections++ -- Other library packages from which modules are imported.+ build-depends: base >=4.14.3.0 && < 4.20+ , free >=5.1.3 && < 5.3+ , transformers ^>= 0.6+ , mtl ^>= 2.3+ , exceptions ^>= 0.10++ -- Directories containing source files.+ hs-source-dirs: src++ -- Base language which the package is written in.+ default-language: Haskell2010++ ghc-options: -W++ if flag(dev)+ ghc-options: -Werror+++test-suite free-listt-test+ -- Import common warning flags.+ import: warnings++ -- Base language which the package is written in.+ default-language: Haskell2010++ -- Modules included in this executable, other than Main.+ -- other-modules:++ -- LANGUAGE extensions used by modules in this package.+ -- other-extensions:++ -- The interface type and version of the test suite.+ type: exitcode-stdio-1.0++ -- Directories containing source files.+ hs-source-dirs: test++ -- The entrypoint to the test suite.+ main-is: Main.hs++ -- Test dependencies.+ build-depends:+ base,+ free-listt++flag dev+ description: Enable warnings as errors. Active on ci.+ default: False+ manual: True
+ src/Control/Applicative/Trans/List.hs view
@@ -0,0 +1,17 @@+-- | The applicative list transformer+module Control.Applicative.Trans.List where++-- base+import Control.Applicative (Alternative)+import Data.Functor.Compose++{- | The 'Applicative' list transformer.++This is isomorphic to the "old" @ListT@ transformer.+It is not a monad, but a lawful 'Applicative'.+-}+newtype ListT f a = ListT {runListT :: f [a]}+ deriving (Functor)+ deriving+ (Applicative, Alternative)+ via (Compose f [])
+ src/Control/Monad/Trans/List.hs view
@@ -0,0 +1,73 @@+-- | Free list monad transformer+module Control.Monad.Trans.List where++-- base+import Control.Applicative+import Control.Monad+import Control.Monad.IO.Class+import Data.Functor.Classes++-- transformers+import Control.Monad.Trans.Class++-- mtl+import Control.Monad.Error.Class+import Control.Monad.RWS (MonadRWS, MonadReader, MonadState)+import Control.Monad.Writer++-- exceptions+import Control.Monad.Catch (MonadCatch, MonadThrow)++-- free+import Control.Monad.Trans.Free++-- free-listt+import Control.Applicative.Trans.List qualified as Applicative++{- | The free list monad transformer.++It is implemented as a rose tree (see https://en.wikipedia.org/wiki/Rose_tree)+of computations in @m@.+-}+newtype ListT m a = ListT {getListT :: FreeT [] m a}+ deriving+ ( Functor+ , Applicative+ , Monad+ , Alternative+ , MonadPlus+ , MonadIO+ , MonadFail+ , MonadTrans+ , Eq1+ , Ord1+ , Read1+ , Show1+ , Eq+ , Ord+ , Read+ , Show+ , MonadError e+ , MonadState s+ , MonadReader r+ , MonadRWS r w s+ , MonadWriter w+ , MonadCatch+ , MonadThrow+ )++-- | Flatten all layers of computations to a single one.+flatten :: (Monad m) => ListT m a -> Applicative.ListT m a+flatten = Applicative.ListT . runListT++-- | Like 'flatten', but remove the 'Applicative.ListT' wrapper.+runListT :: (Monad m) => ListT m a -> m [a]+runListT = iterT (fmap concat . sequence) . fmap pure . getListT++-- | Construct a 'ListT' from an effectful list (a single layer).+listT :: (Monad m) => m [a] -> ListT m a+listT = ListT . FreeT . fmap (Free . fmap pure)++-- | Construct a 'ListT' from a single effectful value.+singleton :: (Functor m) => m a -> ListT m a+singleton = ListT . FreeT . fmap Pure
+ test/Main.hs view
@@ -0,0 +1,6 @@+module Main (main) where++main :: IO ()+main = putStrLn "Test suite not yet implemented."++-- all laws, including some version of alternative