List 0.5.2 → 0.6.0
raw patch · 5 files changed
+104/−108 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Control.Monad.ListT: runListT :: ListT m a -> m (ListItem (ListT m) a)
- Control.Monad.Trans.List: ListT :: m (ListItem (ListT m) a) -> ListT m a
- Control.Monad.Trans.List: instance Eq (m (ListItem (ListT m) a)) => Eq (ListT m a)
- Control.Monad.Trans.List: instance Monad m => Alternative (ListT m)
- Control.Monad.Trans.List: instance Monad m => Applicative (ListT m)
- Control.Monad.Trans.List: instance Monad m => Functor (ListT m)
- Control.Monad.Trans.List: instance Monad m => List (ListT m)
- Control.Monad.Trans.List: instance Monad m => Monad (ListT m)
- Control.Monad.Trans.List: instance Monad m => MonadPlus (ListT m)
- Control.Monad.Trans.List: instance Monad m => Monoid (ListT m a)
- Control.Monad.Trans.List: instance MonadIO m => MonadIO (ListT m)
- Control.Monad.Trans.List: instance MonadTrans ListT
- Control.Monad.Trans.List: instance Ord (m (ListItem (ListT m) a)) => Ord (ListT m a)
- Control.Monad.Trans.List: instance Read (m (ListItem (ListT m) a)) => Read (ListT m a)
- Control.Monad.Trans.List: instance Show (m (ListItem (ListT m) a)) => Show (ListT m a)
- Control.Monad.Trans.List: newtype ListT m a
- Control.Monad.Trans.List: runListT :: ListT m a -> m (ListItem (ListT m) a)
- Control.Monad.Trans.List.Funcs: fromList :: Monad m => [a] -> ListT m a
- Control.Monad.Trans.List.Funcs: iterateM :: Monad m => (a -> m a) -> m a -> ListT m a
- Control.Monad.Trans.List.Funcs: repeat :: Monad m => a -> ListT m a
- Control.Monad.Trans.List.Funcs: repeatM :: Monad m => m a -> ListT m a
- Data.List.Class: headL :: ListItem l a -> a
- Data.List.Class: instance (Eq a, Eq (l a)) => Eq (ListItem l a)
- Data.List.Class: instance (Ord a, Ord (l a)) => Ord (ListItem l a)
- Data.List.Class: instance (Read a, Read (l a)) => Read (ListItem l a)
- Data.List.Class: instance (Show a, Show (l a)) => Show (ListItem l a)
- Data.List.Class: instance Functor m => Functor (ListItem m)
- Data.List.Class: instance List []
- Data.List.Class: tailL :: ListItem l a -> l a
+ Control.Monad.ListT: [runListT] :: ListT m a -> m (ListItem (ListT m) a)
+ Control.Monad.ListT: instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.Monad.ListT.ListT m)
+ Control.Monad.ListT: instance Control.Monad.Trans.Class.MonadTrans Control.Monad.ListT.ListT
+ Control.Monad.ListT: instance GHC.Base.Monad m => Data.List.Class.List (Control.Monad.ListT.ListT m)
+ Control.Monad.ListT: instance GHC.Base.Monad m => GHC.Base.Alternative (Control.Monad.ListT.ListT m)
+ Control.Monad.ListT: instance GHC.Base.Monad m => GHC.Base.Applicative (Control.Monad.ListT.ListT m)
+ Control.Monad.ListT: instance GHC.Base.Monad m => GHC.Base.Functor (Control.Monad.ListT.ListT m)
+ Control.Monad.ListT: instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.ListT.ListT m)
+ Control.Monad.ListT: instance GHC.Base.Monad m => GHC.Base.MonadPlus (Control.Monad.ListT.ListT m)
+ Control.Monad.ListT: instance GHC.Base.Monad m => GHC.Base.Monoid (Control.Monad.ListT.ListT m a)
+ Control.Monad.ListT: instance GHC.Classes.Eq (m (Data.List.Class.ListItem (Control.Monad.ListT.ListT m) a)) => GHC.Classes.Eq (Control.Monad.ListT.ListT m a)
+ Control.Monad.ListT: instance GHC.Classes.Ord (m (Data.List.Class.ListItem (Control.Monad.ListT.ListT m) a)) => GHC.Classes.Ord (Control.Monad.ListT.ListT m a)
+ Control.Monad.ListT: instance GHC.Read.Read (m (Data.List.Class.ListItem (Control.Monad.ListT.ListT m) a)) => GHC.Read.Read (Control.Monad.ListT.ListT m a)
+ Control.Monad.ListT: instance GHC.Show.Show (m (Data.List.Class.ListItem (Control.Monad.ListT.ListT m) a)) => GHC.Show.Show (Control.Monad.ListT.ListT m a)
+ Control.Monad.ListT.Funcs: fromList :: Monad m => [a] -> ListT m a
+ Control.Monad.ListT.Funcs: iterateM :: Monad m => (a -> m a) -> m a -> ListT m a
+ Control.Monad.ListT.Funcs: repeat :: Monad m => a -> ListT m a
+ Control.Monad.ListT.Funcs: repeatM :: Monad m => m a -> ListT m a
+ Data.List.Class: [headL] :: ListItem l a -> a
+ Data.List.Class: [tailL] :: ListItem l a -> l a
+ Data.List.Class: instance (GHC.Classes.Eq (l a), GHC.Classes.Eq a) => GHC.Classes.Eq (Data.List.Class.ListItem l a)
+ Data.List.Class: instance (GHC.Classes.Ord (l a), GHC.Classes.Ord a) => GHC.Classes.Ord (Data.List.Class.ListItem l a)
+ Data.List.Class: instance (GHC.Read.Read (l a), GHC.Read.Read a) => GHC.Read.Read (Data.List.Class.ListItem l a)
+ Data.List.Class: instance (GHC.Show.Show (l a), GHC.Show.Show a) => GHC.Show.Show (Data.List.Class.ListItem l a)
+ Data.List.Class: instance Data.List.Class.List []
+ Data.List.Class: instance GHC.Base.Functor m => GHC.Base.Functor (Data.List.Class.ListItem m)
+ Data.List.Class: type family ItemM l :: * -> *;
+ Data.List.Class: }
- Data.List.Class: class (MonadPlus l, Monad (ItemM l)) => List l where type family ItemM l :: * -> * cons = mplus . return
+ Data.List.Class: class (MonadPlus l, Monad (ItemM l)) => List l where type ItemM l :: * -> * cons = mplus . return where {
Files
- List.cabal +2/−3
- src/Control/Monad/ListT.hs +78/−4
- src/Control/Monad/ListT/Funcs.hs +24/−0
- src/Control/Monad/Trans/List.hs +0/−77
- src/Control/Monad/Trans/List/Funcs.hs +0/−24
List.cabal view
@@ -1,5 +1,5 @@ Name: List-Version: 0.5.2+Version: 0.6.0 Category: Control Synopsis: List monad transformer and class Description:@@ -19,7 +19,6 @@ Extensions: Build-Depends: base >= 3 && < 5, transformers >= 0.2 Exposed-modules: Control.Monad.ListT,- Control.Monad.Trans.List,- Control.Monad.Trans.List.Funcs,+ Control.Monad.ListT.Funcs, Data.List.Class Ghc-Options: -O2 -Wall
src/Control/Monad/ListT.hs view
@@ -1,8 +1,82 @@--- Alternative module name to "List"'s @Control.Monad.Trans.List@.--- The name @Control.Monad.Trans.List@ conflicts with "transformers"'s broken ListT.+{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, StandaloneDeriving, TypeFamilies, UndecidableInstances #-}++-- | A list monad transformer / a monadic list. ----- Import this module and not @Control.Monad.Trans.List@ if using both packages.+-- Monadic list example:+-- A program which reads numbers from the user and accumulates them.+--+-- > import Control.Monad.ListT.Funcs (repeatM)+-- > import Data.List.Class (execute, scanl, takeWhile, mapL)+-- > import Prelude hiding (scanl, takeWhile)+-- >+-- > main =+-- > execute . mapL print .+-- > scanl (+) 0 .+-- > fmap (fst . head) .+-- > takeWhile (not . null) .+-- > fmap reads $ repeatM getLine+--+-- Note:+-- The `transformers` package also has a `ListT` type,+-- which oddly enough it is not a list monad transformer.+-- This module was deliberately named differently from `transformers`'s module. module Control.Monad.ListT (ListT(..)) where -import Control.Monad.Trans.List (ListT(..))+import Data.List.Class (List(..), ListItem(..), foldrL)++import Control.Applicative (Alternative(..), Applicative(..))+import Control.Monad (MonadPlus(..), ap, liftM)+import Control.Monad.IO.Class (MonadIO(..))+import Control.Monad.Trans.Class (MonadTrans(..))+import Data.Monoid (Monoid(..))++newtype ListT m a =+ ListT { runListT :: m (ListItem (ListT m) a) }++deriving instance (Eq (m (ListItem (ListT m) a))) => Eq (ListT m a)+deriving instance (Ord (m (ListItem (ListT m) a))) => Ord (ListT m a)+deriving instance (Read (m (ListItem (ListT m) a))) => Read (ListT m a)+deriving instance (Show (m (ListItem (ListT m) a))) => Show (ListT m a)++-- for mappend, fmap, bind+foldrL' :: List l => (a -> l b -> l b) -> l b -> l a -> l b+foldrL' consFunc nilFunc =+ joinL . foldrL step (return nilFunc)+ where+ step x = return . consFunc x . joinL++instance Monad m => Monoid (ListT m a) where+ mempty = ListT $ return Nil+ mappend = flip (foldrL' cons)++instance Monad m => Functor (ListT m) where+ fmap func = foldrL' (cons . func) mempty++instance Monad m => Monad (ListT m) where+ return = ListT . return . (`Cons` mempty)+ a >>= b = foldrL' mappend mempty (fmap b a)++instance Monad m => Applicative (ListT m) where+ pure = return+ (<*>) = ap++instance Monad m => Alternative (ListT m) where+ empty = mempty+ (<|>) = mappend++instance Monad m => MonadPlus (ListT m) where+ mzero = mempty+ mplus = mappend++instance MonadTrans ListT where+ lift = ListT . liftM (`Cons` mempty)++instance Monad m => List (ListT m) where+ type ItemM (ListT m) = m+ runList = runListT+ joinL = ListT . (>>= runList)+ cons x = ListT . return . Cons x++instance MonadIO m => MonadIO (ListT m) where+ liftIO = lift . liftIO
+ src/Control/Monad/ListT/Funcs.hs view
@@ -0,0 +1,24 @@+-- | @List@ functions with type limited to use @ListT@.+-- This might come useful for type interference.+--+-- Functions where the @List@ is an input type and not only the result type do not need special limited versions.++module Control.Monad.ListT.Funcs+ ( iterateM, repeatM, repeat, fromList+ ) where++import Control.Monad.ListT (ListT)+import qualified Data.List.Class as ListFuncs+import Prelude hiding (repeat)++iterateM :: Monad m => (a -> m a) -> m a -> ListT m a+iterateM = ListFuncs.iterateM++repeatM :: Monad m => m a -> ListT m a+repeatM = ListFuncs.repeatM++repeat :: Monad m => a -> ListT m a+repeat = ListFuncs.repeat++fromList :: Monad m => [a] -> ListT m a+fromList = ListFuncs.fromList
− src/Control/Monad/Trans/List.hs
@@ -1,77 +0,0 @@-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, StandaloneDeriving, TypeFamilies, UndecidableInstances #-}---- | A list monad transformer / a monadic list.------ Monadic list example:--- A program which reads numbers from the user and accumulates them.------ > import Control.Monad.Trans.List.Funcs (repeatM)--- > import Data.List.Class (execute, scanl, takeWhile, mapL)--- > import Prelude hiding (scanl, takeWhile)--- > --- > main =--- > execute . mapL print .--- > scanl (+) 0 .--- > fmap (fst . head) .--- > takeWhile (not . null) .--- > fmap reads $ repeatM getLine--module Control.Monad.Trans.List (ListT(..)) where--import Data.List.Class (List(..), ListItem(..), foldrL)--import Control.Applicative-import Control.Monad (MonadPlus(..), ap, liftM)-import Control.Monad.IO.Class (MonadIO(..))-import Control.Monad.Trans.Class (MonadTrans(..))-import Data.Monoid (Monoid(..))--newtype ListT m a =- ListT { runListT :: m (ListItem (ListT m) a) }--deriving instance (Eq (m (ListItem (ListT m) a))) => Eq (ListT m a)-deriving instance (Ord (m (ListItem (ListT m) a))) => Ord (ListT m a)-deriving instance (Read (m (ListItem (ListT m) a))) => Read (ListT m a)-deriving instance (Show (m (ListItem (ListT m) a))) => Show (ListT m a)---- for mappend, fmap, bind-foldrL' :: List l => (a -> l b -> l b) -> l b -> l a -> l b-foldrL' consFunc nilFunc =- joinL . foldrL step (return nilFunc)- where- step x = return . consFunc x . joinL--instance Monad m => Monoid (ListT m a) where- mempty = ListT $ return Nil- mappend = flip (foldrL' cons)--instance Monad m => Functor (ListT m) where- fmap func = foldrL' (cons . func) mempty--instance Monad m => Monad (ListT m) where- return = ListT . return . (`Cons` mempty)- a >>= b = foldrL' mappend mempty (fmap b a)--instance Monad m => Applicative (ListT m) where- pure = return- (<*>) = ap--instance Monad m => MonadPlus (ListT m) where- mzero = mempty- mplus = mappend--instance Monad m => Alternative (ListT m) where- (<|>) = mplus- empty = mzero--instance MonadTrans ListT where- lift = ListT . liftM (`Cons` mempty)--instance Monad m => List (ListT m) where- type ItemM (ListT m) = m- runList = runListT- joinL = ListT . (>>= runList)- cons x = ListT . return . Cons x--instance MonadIO m => MonadIO (ListT m) where- liftIO = lift . liftIO
− src/Control/Monad/Trans/List/Funcs.hs
@@ -1,24 +0,0 @@--- | @List@ functions with type limited to use @ListT@.--- This might come useful for type interference.------ Functions where the @List@ is an input type and not only the result type do not need special limited versions.--module Control.Monad.Trans.List.Funcs- ( iterateM, repeatM, repeat, fromList- ) where--import Control.Monad.Trans.List (ListT)-import qualified Data.List.Class as ListFuncs-import Prelude hiding (repeat)--iterateM :: Monad m => (a -> m a) -> m a -> ListT m a-iterateM = ListFuncs.iterateM--repeatM :: Monad m => m a -> ListT m a-repeatM = ListFuncs.repeatM--repeat :: Monad m => a -> ListT m a-repeat = ListFuncs.repeat--fromList :: Monad m => [a] -> ListT m a-fromList = ListFuncs.fromList