contstuff 0.5.1 → 0.6.0
raw patch · 2 files changed
+345/−305 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Control.ContStuff: instance (Alternative m) => Alternative (ContT r m)
- Control.ContStuff: instance (Alternative m) => Alternative (EitherT r e m)
- Control.ContStuff: instance (Alternative m) => Alternative (IdT m)
- Control.ContStuff: instance (Alternative m) => Alternative (StateT r s m)
- Control.ContStuff: instance (Alternative m) => MonadPlus (ContT r m)
- Control.ContStuff: instance (Alternative m) => MonadPlus (EitherT r e m)
- Control.ContStuff: instance (Alternative m) => MonadPlus (MaybeT r m)
- Control.ContStuff: instance (Alternative m) => MonadPlus (StateT r s m)
- Control.ContStuff: instance (Alternative m) => Writable (ContT r m) r
- Control.ContStuff: instance (Alternative m) => Writable (EitherT r e m) r
- Control.ContStuff: instance (Alternative m) => Writable (MaybeT r m) r
- Control.ContStuff: instance (Alternative m) => Writable (StateT r s m) r
- Control.ContStuff: instance (Applicative m) => Abortable (ChoiceT r i m)
- Control.ContStuff: instance (Applicative m) => Abortable (ContT r m)
- Control.ContStuff: instance (Applicative m) => Abortable (EitherT r e m)
- Control.ContStuff: instance (Applicative m) => Abortable (MaybeT r m)
- Control.ContStuff: instance (Applicative m) => Abortable (StateT r s m)
- Control.ContStuff: instance (Applicative m) => Applicative (IdT m)
- Control.ContStuff: instance (Functor m) => Functor (IdT m)
- Control.ContStuff: instance (Monad m) => Monad (IdT m)
- Control.ContStuff: instance (MonadFix m) => MonadFix (IdT m)
- Control.ContStuff: instance (Show a) => Show (Id a)
+ Control.ContStuff: forbid :: ((Exception (t m)) ~ (), HasExceptions (t m), Monad m, Monad (t m), Transformer t) => m Bool -> t m ()
+ Control.ContStuff: instance Alternative m => Alternative (ContT r m)
+ Control.ContStuff: instance Alternative m => Alternative (EitherT r e m)
+ Control.ContStuff: instance Alternative m => Alternative (IdT m)
+ Control.ContStuff: instance Alternative m => Alternative (StateT r s m)
+ Control.ContStuff: instance Alternative m => MonadPlus (ContT r m)
+ Control.ContStuff: instance Alternative m => MonadPlus (EitherT r e m)
+ Control.ContStuff: instance Alternative m => MonadPlus (MaybeT r m)
+ Control.ContStuff: instance Alternative m => MonadPlus (StateT r s m)
+ Control.ContStuff: instance Alternative m => Writable (ContT r m) r
+ Control.ContStuff: instance Alternative m => Writable (EitherT r e m) r
+ Control.ContStuff: instance Alternative m => Writable (MaybeT r m) r
+ Control.ContStuff: instance Alternative m => Writable (StateT r s m) r
+ Control.ContStuff: instance Applicative m => Abortable (ChoiceT r i m)
+ Control.ContStuff: instance Applicative m => Abortable (ContT r m)
+ Control.ContStuff: instance Applicative m => Abortable (EitherT r e m)
+ Control.ContStuff: instance Applicative m => Abortable (MaybeT r m)
+ Control.ContStuff: instance Applicative m => Abortable (StateT r s m)
+ Control.ContStuff: instance Applicative m => Applicative (IdT m)
+ Control.ContStuff: instance Functor m => Functor (IdT m)
+ Control.ContStuff: instance Monad m => Monad (IdT m)
+ Control.ContStuff: instance MonadFix m => MonadFix (IdT m)
+ Control.ContStuff: instance Show a => Show (Id a)
+ Control.ContStuff: raiseUnless :: (HasExceptions m, Monad m) => Exception m -> m Bool -> m ()
+ Control.ContStuff: raiseWhen :: (HasExceptions m, Monad m) => Exception m -> m Bool -> m ()
+ Control.ContStuff: require :: ((Exception (t m)) ~ (), HasExceptions (t m), Monad m, Monad (t m), Transformer t) => m Bool -> t m ()
- Control.ContStuff: abort :: (Abortable m) => Result m -> m a
+ Control.ContStuff: abort :: Abortable m => Result m -> m a
- Control.ContStuff: base :: (LiftBase m) => Base m a -> m a
+ Control.ContStuff: base :: LiftBase m => Base m a -> m a
- Control.ContStuff: callCC :: (CallCC m) => ((a -> m b) -> m a) -> m a
+ Control.ContStuff: callCC :: CallCC m => ((a -> m b) -> m a) -> m a
- Control.ContStuff: evalContT :: (Applicative m) => ContT r m r -> m r
+ Control.ContStuff: evalContT :: Applicative m => ContT r m r -> m r
- Control.ContStuff: evalEitherT :: (Applicative m) => EitherT (Either e a) e m a -> m (Either e a)
+ Control.ContStuff: evalEitherT :: Applicative m => EitherT (Either e a) e m a -> m (Either e a)
- Control.ContStuff: evalMaybeT :: (Applicative m) => MaybeT (Maybe a) m a -> m (Maybe a)
+ Control.ContStuff: evalMaybeT :: Applicative m => MaybeT (Maybe a) m a -> m (Maybe a)
- Control.ContStuff: evalOldWriter :: (Monoid w) => OldWriter r w r -> r
+ Control.ContStuff: evalOldWriter :: Monoid w => OldWriter r w r -> r
- Control.ContStuff: evalStateT :: (Applicative m) => s -> StateT r s m r -> m r
+ Control.ContStuff: evalStateT :: Applicative m => s -> StateT r s m r -> m r
- Control.ContStuff: execOldWriter :: (Monoid w) => OldWriter r w r -> w
+ Control.ContStuff: execOldWriter :: Monoid w => OldWriter r w r -> w
- Control.ContStuff: execStateT :: (Applicative m) => s -> StateT s s m a -> m s
+ Control.ContStuff: execStateT :: Applicative m => s -> StateT s s m a -> m s
- Control.ContStuff: findAll_ :: (Applicative m) => ChoiceT () i m a -> m ()
+ Control.ContStuff: findAll_ :: Applicative m => ChoiceT () i m a -> m ()
- Control.ContStuff: findFirst_ :: (Applicative m) => ChoiceT () i m a -> m ()
+ Control.ContStuff: findFirst_ :: Applicative m => ChoiceT () i m a -> m ()
- Control.ContStuff: get :: (Stateful m) => m (StateOf m)
+ Control.ContStuff: get :: Stateful m => m (StateOf m)
- Control.ContStuff: listA :: (Alternative f) => [a] -> f a
+ Control.ContStuff: listA :: Alternative f => [a] -> f a
- Control.ContStuff: listChoiceT :: (Applicative m) => ChoiceT [a] [a] m a -> m [a]
+ Control.ContStuff: listChoiceT :: Applicative m => ChoiceT [a] [a] m a -> m [a]
- Control.ContStuff: maybeChoiceT :: (Applicative m) => ChoiceT (Maybe a) (Maybe a) m a -> m (Maybe a)
+ Control.ContStuff: maybeChoiceT :: Applicative m => ChoiceT (Maybe a) (Maybe a) m a -> m (Maybe a)
- Control.ContStuff: modifyContT :: (Functor m) => (r -> r) -> ContT r m ()
+ Control.ContStuff: modifyContT :: Functor m => (r -> r) -> ContT r m ()
- Control.ContStuff: modifyEitherT :: (Functor m) => (r -> r) -> EitherT r e m ()
+ Control.ContStuff: modifyEitherT :: Functor m => (r -> r) -> EitherT r e m ()
- Control.ContStuff: modifyMaybeT :: (Functor m) => (r -> r) -> MaybeT r m ()
+ Control.ContStuff: modifyMaybeT :: Functor m => (r -> r) -> MaybeT r m ()
- Control.ContStuff: put :: (Stateful m) => StateOf m -> m ()
+ Control.ContStuff: put :: Stateful m => StateOf m -> m ()
- Control.ContStuff: putLazy :: (Stateful m) => StateOf m -> m ()
+ Control.ContStuff: putLazy :: Stateful m => StateOf m -> m ()
- Control.ContStuff: raise :: (HasExceptions m) => Exception m -> m a
+ Control.ContStuff: raise :: HasExceptions m => Exception m -> m a
- Control.ContStuff: runOldWriter :: (Monoid w) => OldWriter r w r -> (r, w)
+ Control.ContStuff: runOldWriter :: Monoid w => OldWriter r w r -> (r, w)
- Control.ContStuff: runT :: (Runnable t r m a) => Argument t r m a -> t m a -> m r
+ Control.ContStuff: runT :: Runnable t r m a => Argument t r m a -> t m a -> m r
- Control.ContStuff: runWriterT :: (Alternative m) => WriterT r m a -> m r
+ Control.ContStuff: runWriterT :: Alternative m => WriterT r m a -> m r
- Control.ContStuff: tell :: (Writable m w) => w -> m ()
+ Control.ContStuff: tell :: Writable m w => w -> m ()
- Control.ContStuff: try :: (HasExceptions m) => m a -> m (Either (Exception m) a)
+ Control.ContStuff: try :: HasExceptions m => m a -> m (Either (Exception m) a)
Files
- Control/ContStuff.hs +338/−301
- contstuff.cabal +7/−4
Control/ContStuff.hs view
@@ -14,57 +14,59 @@ TypeFamilies #-} module Control.ContStuff- ( -- * Monad transformers- -- ** Identity transformer- IdT(..),- -- ** ContT- ContT(..), runContT, evalContT, modifyContT,- -- ** Choice/nondeterminism- ChoiceT(..), runChoiceT, choice, findFirst, findFirst_, findAll,- findAll_, listChoiceT, listA, maybeChoiceT,- -- ** Exceptions- EitherT(..), runEitherT, evalEitherT, modifyEitherT,- MaybeT(..), runMaybeT, evalMaybeT, modifyMaybeT,- -- ** State- StateT(..), runStateT, evalStateT, execStateT,- -- ** Writer monads- WriterT, runWriterT,- OldWriterT, runOldWriterT, evalOldWriterT, execOldWriterT,+ ( -- * Monad transformers+ -- ** Identity transformer+ IdT(..),+ -- ** ContT+ ContT(..), runContT, evalContT, modifyContT,+ -- ** Choice/nondeterminism+ ChoiceT(..), runChoiceT, choice, findAll, findAll_, findFirst,+ findFirst_, listA, listChoiceT, maybeChoiceT,+ -- ** Exceptions+ EitherT(..), runEitherT, evalEitherT, modifyEitherT,+ MaybeT(..), runMaybeT, evalMaybeT, modifyMaybeT,+ -- ** State+ StateT(..), runStateT, evalStateT, execStateT,+ -- ** Writer monads+ WriterT, runWriterT,+ OldWriterT, runOldWriterT, evalOldWriterT, execOldWriterT, - -- * Monads- -- ** Identity monad- Id(..),- -- ** Choice- Choice, listChoice, maybeChoice,- -- ** Cont- Cont, runCont, evalCont, modifyCont,- -- ** State- State, runState, evalState, execState,- -- ** Writer- OldWriter, runOldWriter, evalOldWriter, execOldWriter,+ -- * Monads+ -- ** Identity monad+ Id(..),+ -- ** Choice+ Choice, listChoice, maybeChoice,+ -- ** Cont+ Cont, runCont, evalCont, modifyCont,+ -- ** State+ State, runState, evalState, execState,+ -- ** Writer+ OldWriter, runOldWriter, evalOldWriter, execOldWriter, - -- * Effect classes- -- ** Abortion- Abortable(..),- -- ** Call with current continuation- CallCC(..), Label, labelCC, goto,- -- ** Exceptions- HasExceptions(..), catch, handle, finally, bracket, bracket_,- -- ** Lifting- Transformer(..),- LiftBase(..), io,- -- ** Running- Runnable(..),- -- ** State- Stateful(..), getField, modify, modifyField, modifyFieldLazy, modifyLazy,- -- ** Logging support (writers)- Writable(..),+ -- * Effect classes+ -- ** Abortion+ Abortable(..),+ -- ** Call with current continuation+ CallCC(..), Label, labelCC, goto,+ -- ** Exceptions+ HasExceptions(..), bracket, bracket_, catch, finally, forbid,+ handle, raiseUnless, raiseWhen, require,+ -- ** Lifting+ Transformer(..),+ LiftBase(..), io,+ -- ** Running+ Runnable(..),+ -- ** State+ Stateful(..), getField, modify, modifyField, modifyFieldLazy,+ modifyLazy,+ -- ** Logging support (writers)+ Writable(..), - -- * Module reexports- module Control.Applicative,- module Control.Monad- )- where+ -- * Module reexports+ module Control.Applicative,+ module Control.Monad+ )+ where import qualified Control.Exception as E import Control.Applicative@@ -87,21 +89,21 @@ newtype Id a = Id { getId :: a } instance Functor Id where- fmap f (Id x) = Id (f x)+ fmap f (Id x) = Id (f x) instance Applicative Id where- pure = Id- Id f <*> Id x = Id (f x)+ pure = Id+ Id f <*> Id x = Id (f x) instance Monad Id where- return = Id- Id x >>= f = f x+ return = Id+ Id x >>= f = f x instance MonadFix Id where- mfix f = fix (f . getId)+ mfix f = fix (f . getId) instance Show a => Show (Id a) where- show x = "Id " ++ show x+ show x = "Id " ++ show x -- ================== --@@ -118,55 +120,55 @@ -- represented as a CPS-based left-fold function. newtype ChoiceT r i m a =- ChoiceT { getChoiceT ::- (i -> a -> (i -> m r) -> m r)- -> i- -> (i -> m r)- -> m r }+ ChoiceT { getChoiceT ::+ (i -> a -> (i -> m r) -> m r)+ -> i+ -> (i -> m r)+ -> m r } instance Applicative m => Abortable (ChoiceT r i m) where- type Result (ChoiceT r i m) = r- abort x = ChoiceT $ \_ _ _ -> pure x+ type Result (ChoiceT r i m) = r+ abort x = ChoiceT $ \_ _ _ -> pure x instance Alternative (ChoiceT r i m) where- empty = ChoiceT $ \_ z k -> k z- ChoiceT c <|> ChoiceT d =- ChoiceT $ \fold z k ->- c fold z (\zc -> d fold zc k)+ empty = ChoiceT $ \_ z k -> k z+ ChoiceT c <|> ChoiceT d =+ ChoiceT $ \fold z k ->+ c fold z (\zc -> d fold zc k) instance Applicative (ChoiceT r i m) where- pure x = ChoiceT $ \fold z k -> fold z x k- ChoiceT cf <*> ChoiceT cx =- ChoiceT $ \fold z k ->- cx (\xx yx kx -> cf (\xf yf kf -> fold xf (yf yx) kf) xx kx) z k+ pure x = ChoiceT $ \fold z k -> fold z x k+ ChoiceT cf <*> ChoiceT cx =+ ChoiceT $ \fold z k ->+ cx (\xx yx kx -> cf (\xf yf kf -> fold xf (yf yx) kf) xx kx) z k instance Functor (ChoiceT r i m) where- fmap f (ChoiceT c) =- ChoiceT $ \fold z k ->- c (\x y k -> fold x (f y) k) z k+ fmap f (ChoiceT c) =+ ChoiceT $ \fold z k ->+ c (\x y k -> fold x (f y) k) z k instance Monad (ChoiceT r i m) where- return x = ChoiceT $ \fold z k -> fold z x k- ChoiceT c >>= f =- ChoiceT $ \fold z k ->- c (\x y kc -> getChoiceT (f y) fold x kc) z k+ return x = ChoiceT $ \fold z k -> fold z x k+ ChoiceT c >>= f =+ ChoiceT $ \fold z k ->+ c (\x y kc -> getChoiceT (f y) fold x kc) z k instance MonadPlus (ChoiceT r i m) where- mzero = empty- mplus = (<|>)+ mzero = empty+ mplus = (<|>) instance Transformer (ChoiceT r i) where- lift c = ChoiceT $ \fold z k -> c >>= \x -> fold z x k+ lift c = ChoiceT $ \fold z k -> c >>= \x -> fold z x k -- | Run a choice computation. runChoiceT ::- (i -> a -> (i -> m r) -> m r)- -> i- -> (i -> m r)- -> ChoiceT r i m a- -> m r+ (i -> a -> (i -> m r) -> m r)+ -> i+ -> (i -> m r)+ -> ChoiceT r i m a+ -> m r runChoiceT fold z k (ChoiceT c) = c fold z k @@ -174,11 +176,23 @@ choice :: [a] -> ChoiceT r i m a choice xs = ChoiceT (choice' xs)- where+ where choice' [] = \_ z k -> k z choice' (x:xs) = \fold z k -> fold z x (\y -> choice' xs fold y k) +-- | Find all solutions.++findAll :: (Alternative f, Applicative m) => ChoiceT (f a) (f a) m a -> m (f a)+findAll = runChoiceT (\x y k -> k (x <|> pure y)) empty pure+++-- | Find all solutions and ignore them.++findAll_ :: Applicative m => ChoiceT () i m a -> m ()+findAll_ = runChoiceT (\_ _ k -> k undefined) undefined (const $ pure ())++ -- | Find the first solution. findFirst :: (Alternative f, Applicative m) => ChoiceT (f a) (f a) m a -> m (f a)@@ -191,16 +205,10 @@ findFirst_ = runChoiceT (\_ _ _ -> pure ()) undefined (const $ pure ()) --- | Find all solutions.--findAll :: (Alternative f, Applicative m) => ChoiceT (f a) (f a) m a -> m (f a)-findAll = runChoiceT (\x y k -> k (x <|> pure y)) empty pure----- | Find all solutions and ignore them.+-- | Turn a list into a computation with alternatives. -findAll_ :: Applicative m => ChoiceT () i m a -> m ()-findAll_ = runChoiceT (\_ _ k -> k undefined) undefined (const $ pure ())+listA :: Alternative f => [a] -> f a+listA = foldr (<|>) empty . map pure -- | Get list of solutions (faster than 'findAll', but returns solutions@@ -210,12 +218,6 @@ listChoiceT = runChoiceT (\x y k -> k (y:x)) [] pure --- | Turn a list into a computation with alternatives.--listA :: Alternative f => [a] -> f a-listA = foldr (<|>) empty . map pure-- -- | Get one solution (faster than 'findFirst'). maybeChoiceT :: Applicative m => ChoiceT (Maybe a) (Maybe a) m a -> m (Maybe a)@@ -247,48 +249,48 @@ -- transformer models the most basic form of CPS. newtype ContT r m a =- ContT { getContT :: (a -> m r) -> m r }+ ContT { getContT :: (a -> m r) -> m r } instance Applicative m => Abortable (ContT r m) where- type Result (ContT r m) = r- abort = ContT . const . pure+ type Result (ContT r m) = r+ abort = ContT . const . pure instance Alternative m => Alternative (ContT r m) where- empty = ContT $ const empty- ContT c <|> ContT d = ContT $ \k -> c k <|> d k+ empty = ContT $ const empty+ ContT c <|> ContT d = ContT $ \k -> c k <|> d k instance Applicative (ContT r m) where- pure = return- ContT cf <*> ContT cx =- ContT $ \k -> cf (\f -> cx (\x -> k (f x)))+ pure = return+ ContT cf <*> ContT cx =+ ContT $ \k -> cf (\f -> cx (\x -> k (f x))) instance CallCC (ContT r m) where- callCC f = ContT $ \k -> getContT (f (ContT . const . k)) k+ callCC f = ContT $ \k -> getContT (f (ContT . const . k)) k instance Functor (ContT r m) where- fmap f (ContT c) = ContT $ \k -> c (\x -> k (f x))+ fmap f (ContT c) = ContT $ \k -> c (\x -> k (f x)) instance Monad (ContT r m) where- return x = ContT $ \k -> k x- ContT c >>= f =- ContT $ \k -> c (\x -> getContT (f x) k)+ return x = ContT $ \k -> k x+ ContT c >>= f =+ ContT $ \k -> c (\x -> getContT (f x) k) instance Alternative m => MonadPlus (ContT r m) where- mzero = empty- mplus = (<|>)+ mzero = empty+ mplus = (<|>) instance Runnable (ContT r) r m a where- type Argument (ContT r) r m a = a -> m r- runT k (ContT c) = c k+ type Argument (ContT r) r m a = a -> m r+ runT k (ContT c) = c k instance Transformer (ContT r) where- lift c = ContT $ \k -> c >>= k+ lift c = ContT $ \k -> c >>= k instance Alternative m => Writable (ContT r m) r where- tell x = ContT $ \k -> pure x <|> k ()+ tell x = ContT $ \k -> pure x <|> k () instance (Functor m, Monoid w) => Writable (ContT (r, w) m) w where- tell x = ContT $ \k -> fmap (second (`mappend` x)) (k ())+ tell x = ContT $ \k -> fmap (second (`mappend` x)) (k ()) -- | Run a CPS-style computation given the supplied final continuation.@@ -340,58 +342,58 @@ -- continuation. newtype EitherT r e m a =- EitherT { getEitherT :: (a -> m r) -> (e -> m r) -> m r }+ EitherT { getEitherT :: (a -> m r) -> (e -> m r) -> m r } instance Applicative m => Abortable (EitherT r e m) where- type Result (EitherT r e m) = r- abort x = EitherT $ \_ _ -> pure x+ type Result (EitherT r e m) = r+ abort x = EitherT $ \_ _ -> pure x instance Applicative (EitherT r e m) where- pure x = EitherT $ \k _ -> k x- EitherT cf <*> EitherT cx =- EitherT $ \k expk -> cf (\f -> cx (\x -> k (f x)) expk) expk+ pure x = EitherT $ \k _ -> k x+ EitherT cf <*> EitherT cx =+ EitherT $ \k expk -> cf (\f -> cx (\x -> k (f x)) expk) expk instance Alternative m => Alternative (EitherT r e m) where- empty = EitherT $ \_ _ -> empty- EitherT c <|> EitherT d =- EitherT $ \k expk -> c k expk <|> d k expk+ empty = EitherT $ \_ _ -> empty+ EitherT c <|> EitherT d =+ EitherT $ \k expk -> c k expk <|> d k expk instance CallCC (EitherT r e m) where- callCC f =- EitherT $ \k expk ->- getEitherT (f (\x -> EitherT $ \_ _ -> k x)) k expk+ callCC f =+ EitherT $ \k expk ->+ getEitherT (f (\x -> EitherT $ \_ _ -> k x)) k expk instance HasExceptions (EitherT r e m) where- type Exception (EitherT r e m) = e- raise exp = EitherT $ \_ expk -> expk exp- try (EitherT c) = EitherT $ \k _ -> c (k . Right) (k . Left)+ type Exception (EitherT r e m) = e+ raise exp = EitherT $ \_ expk -> expk exp+ try (EitherT c) = EitherT $ \k _ -> c (k . Right) (k . Left) instance Functor (EitherT r e m) where- fmap f (EitherT c) =- EitherT $ \k expk -> c (k . f) expk+ fmap f (EitherT c) =+ EitherT $ \k expk -> c (k . f) expk instance Monad (EitherT r e m) where- return x = EitherT $ \k _ -> k x- EitherT c >>= f =- EitherT $ \k expk ->- c (\x -> getEitherT (f x) k expk) expk+ return x = EitherT $ \k _ -> k x+ EitherT c >>= f =+ EitherT $ \k expk ->+ c (\x -> getEitherT (f x) k expk) expk instance Alternative m => MonadPlus (EitherT r e m) where- mzero = empty- mplus = (<|>)+ mzero = empty+ mplus = (<|>) instance Runnable (EitherT r e) r m a where- type Argument (EitherT r e) r m a = (a -> m r, e -> m r)- runT (k, expk) (EitherT c) = c k expk+ type Argument (EitherT r e) r m a = (a -> m r, e -> m r)+ runT (k, expk) (EitherT c) = c k expk instance Transformer (EitherT r e) where- lift c = EitherT $ \k _ -> c >>= k+ lift c = EitherT $ \k _ -> c >>= k instance Alternative m => Writable (EitherT r e m) r where- tell x = EitherT $ \k _ -> pure x <|> k ()+ tell x = EitherT $ \k _ -> pure x <|> k () instance (Functor m, Monoid w) => Writable (EitherT (r, w) e m) w where- tell x = EitherT $ \k _ -> fmap (second (`mappend` x)) (k ())+ tell x = EitherT $ \k _ -> fmap (second (`mappend` x)) (k ()) -- | Run an 'EitherT' transformer.@@ -424,33 +426,33 @@ newtype IdT m a = IdT { getIdT :: m a } instance Alternative m => Alternative (IdT m) where- empty = IdT empty- IdT c <|> IdT d = IdT (c <|> d)+ empty = IdT empty+ IdT c <|> IdT d = IdT (c <|> d) instance Applicative m => Applicative (IdT m) where- pure = IdT . pure- IdT cf <*> IdT cx = IdT $ cf <*> cx+ pure = IdT . pure+ IdT cf <*> IdT cx = IdT $ cf <*> cx instance Functor m => Functor (IdT m) where- fmap f (IdT c) = IdT (fmap f c)+ fmap f (IdT c) = IdT (fmap f c) instance Monad m => Monad (IdT m) where- return = IdT . return- IdT c >>= f = IdT $ c >>= getIdT . f+ return = IdT . return+ IdT c >>= f = IdT $ c >>= getIdT . f instance (Alternative m, Monad m) => MonadPlus (IdT m) where- mzero = empty- mplus = (<|>)+ mzero = empty+ mplus = (<|>) instance MonadFix m => MonadFix (IdT m) where- mfix f = IdT $ mfix (getIdT . f)+ mfix f = IdT $ mfix (getIdT . f) instance Runnable IdT r m r where- type Argument IdT r m r = ()- runT _ (IdT c) = c+ type Argument IdT r m r = ()+ runT _ (IdT c) = c instance Transformer IdT where- lift = IdT+ lift = IdT ------------@@ -461,59 +463,59 @@ -- continuation with no argument. newtype MaybeT r m a =- MaybeT { getMaybeT :: (a -> m r) -> m r -> m r }+ MaybeT { getMaybeT :: (a -> m r) -> m r -> m r } instance Applicative m => Abortable (MaybeT r m) where- type Result (MaybeT r m) = r- abort x = MaybeT $ \_ _ -> pure x+ type Result (MaybeT r m) = r+ abort x = MaybeT $ \_ _ -> pure x instance Applicative (MaybeT r m) where- pure x = MaybeT $ \just _ -> just x- MaybeT cf <*> MaybeT cx =- MaybeT $ \just noth -> cf (\f -> cx (\x -> just (f x)) noth) noth+ pure x = MaybeT $ \just _ -> just x+ MaybeT cf <*> MaybeT cx =+ MaybeT $ \just noth -> cf (\f -> cx (\x -> just (f x)) noth) noth instance Alternative (MaybeT r m) where- empty = MaybeT $ \_ noth -> noth- MaybeT c <|> MaybeT d =- MaybeT $ \just noth ->- c (\x -> just x) (d (\x -> just x) noth)+ empty = MaybeT $ \_ noth -> noth+ MaybeT c <|> MaybeT d =+ MaybeT $ \just noth ->+ c (\x -> just x) (d (\x -> just x) noth) instance CallCC (MaybeT r m) where- callCC f =- MaybeT $ \just noth ->- getMaybeT (f (\x -> MaybeT $ \_ _ -> just x)) just noth+ callCC f =+ MaybeT $ \just noth ->+ getMaybeT (f (\x -> MaybeT $ \_ _ -> just x)) just noth instance HasExceptions (MaybeT r m) where- type Exception (MaybeT r m) = ()- raise _ = MaybeT $ const id- try (MaybeT c) = MaybeT $ \just _ -> c (just . Right) (just $ Left ())+ type Exception (MaybeT r m) = ()+ raise _ = MaybeT $ const id+ try (MaybeT c) = MaybeT $ \just _ -> c (just . Right) (just $ Left ()) instance Functor (MaybeT r m) where- fmap f (MaybeT c) =- MaybeT $ \just noth -> c (just . f) noth+ fmap f (MaybeT c) =+ MaybeT $ \just noth -> c (just . f) noth instance Monad (MaybeT r m) where- return x = MaybeT $ \just _ -> just x- MaybeT c >>= f =- MaybeT $ \just noth ->- c (\x -> getMaybeT (f x) just noth) noth+ return x = MaybeT $ \just _ -> just x+ MaybeT c >>= f =+ MaybeT $ \just noth ->+ c (\x -> getMaybeT (f x) just noth) noth instance Alternative m => MonadPlus (MaybeT r m) where- mzero = empty- mplus = (<|>)+ mzero = empty+ mplus = (<|>) instance Runnable (MaybeT r) r m a where- type Argument (MaybeT r) r m a = (a -> m r, m r)- runT (just, noth) (MaybeT c) = c just noth+ type Argument (MaybeT r) r m a = (a -> m r, m r)+ runT (just, noth) (MaybeT c) = c just noth instance Transformer (MaybeT r) where- lift c = MaybeT $ \just _ -> c >>= just+ lift c = MaybeT $ \just _ -> c >>= just instance Alternative m => Writable (MaybeT r m) r where- tell x = MaybeT $ \just _ -> pure x <|> just ()+ tell x = MaybeT $ \just _ -> pure x <|> just () instance (Functor m, Monoid w) => Writable (MaybeT (r, w) m) w where- tell x = MaybeT $ \just _ -> fmap (second (`mappend` x)) (just ())+ tell x = MaybeT $ \just _ -> fmap (second (`mappend` x)) (just ()) -- | Run a 'MaybeT' transformer.@@ -591,58 +593,58 @@ -- | Monad transformer for stateful computations. newtype StateT r s m a =- StateT { getStateT :: s -> (s -> a -> m r) -> m r }+ StateT { getStateT :: s -> (s -> a -> m r) -> m r } instance Applicative m => Abortable (StateT r s m) where- type Result (StateT r s m) = r- abort x = StateT $ \_ _ -> pure x+ type Result (StateT r s m) = r+ abort x = StateT $ \_ _ -> pure x instance Alternative m => Alternative (StateT r s m) where- empty = StateT . const . const $ empty- StateT c <|> StateT d =- StateT $ \s0 k -> c s0 k <|> d s0 k+ empty = StateT . const . const $ empty+ StateT c <|> StateT d =+ StateT $ \s0 k -> c s0 k <|> d s0 k instance Applicative (StateT r s m) where- pure = return- StateT cf <*> StateT cx =- StateT $ \s0 k -> cf s0 (\s1 f -> cx s1 (\s2 x -> k s2 (f x)))+ pure = return+ StateT cf <*> StateT cx =+ StateT $ \s0 k -> cf s0 (\s1 f -> cx s1 (\s2 x -> k s2 (f x))) instance CallCC (StateT r s m) where- callCC f =- StateT $ \s0 k ->- getStateT (f (\x -> StateT $ \s1 _ -> k s1 x)) s0 k+ callCC f =+ StateT $ \s0 k ->+ getStateT (f (\x -> StateT $ \s1 _ -> k s1 x)) s0 k instance Functor (StateT r s m) where- fmap f (StateT c) =- StateT $ \s0 k -> c s0 (\s1 -> k s1 . f)+ fmap f (StateT c) =+ StateT $ \s0 k -> c s0 (\s1 -> k s1 . f) instance Monad (StateT r s m) where- return x = StateT $ \s0 k -> k s0 x- StateT c >>= f =- StateT $ \s0 k -> c s0 (\s1 x -> getStateT (f x) s1 k)+ return x = StateT $ \s0 k -> k s0 x+ StateT c >>= f =+ StateT $ \s0 k -> c s0 (\s1 x -> getStateT (f x) s1 k) instance Alternative m => MonadPlus (StateT r s m) where- mzero = empty- mplus = (<|>)+ mzero = empty+ mplus = (<|>) instance Runnable (StateT r s) r m a where- type Argument (StateT r s) r m a = (s, s -> a -> m r)- runT (s0, k) (StateT c) = c s0 k+ type Argument (StateT r s) r m a = (s, s -> a -> m r)+ runT (s0, k) (StateT c) = c s0 k instance Stateful (StateT r s m) where- type StateOf (StateT r s m) = s- get = StateT $ \s0 k -> k s0 s0- put s1 = s1 `seq` StateT $ \_ k -> k s1 ()- putLazy s1 = StateT $ \_ k -> k s1 ()+ type StateOf (StateT r s m) = s+ get = StateT $ \s0 k -> k s0 s0+ put s1 = s1 `seq` StateT $ \_ k -> k s1 ()+ putLazy s1 = StateT $ \_ k -> k s1 () instance Transformer (StateT r s) where- lift c = StateT $ \s0 k -> c >>= k s0+ lift c = StateT $ \s0 k -> c >>= k s0 instance Alternative m => Writable (StateT r s m) r where- tell x = StateT $ \s0 k -> pure x <|> k s0 ()+ tell x = StateT $ \s0 k -> pure x <|> k s0 () instance (Functor m, Monoid w) => Writable (StateT (r, w) s m) w where- tell x = StateT $ \s0 k -> fmap (second (`mappend` x)) (k s0 ())+ tell x = StateT $ \s0 k -> fmap (second (`mappend` x)) (k s0 ()) -- | Run a state transformer.@@ -709,18 +711,18 @@ -- | Monads supporting abortion. class Abortable m where- -- | End result of the computation.- type Result m+ -- | End result of the computation.+ type Result m - -- | Ignore current continuation and abort.- abort :: Result m -> m a+ -- | Ignore current continuation and abort.+ abort :: Result m -> m a -- | Monads supporting *call-with-current-continuation* (aka callCC). class CallCC m where- -- | Call with current continuation.- callCC :: ((a -> m b) -> m a) -> m a+ -- | Call with current continuation.+ callCC :: ((a -> m b) -> m a) -> m a newtype Label m a = Label (a -> Label m a -> m ())@@ -741,48 +743,29 @@ -- | Monads with exception support. class HasExceptions m where- -- | The exception type.- type Exception m+ -- | The exception type.+ type Exception m - -- | Raise an exception.- raise :: Exception m -> m a+ -- | Raise an exception.+ raise :: Exception m -> m a - -- | Run computation catching exceptions.- try :: m a -> m (Either (Exception m) a)+ -- | Run computation catching exceptions.+ try :: m a -> m (Either (Exception m) a) instance HasExceptions (Either e) where- type Exception (Either e) = e- raise = Left- try = Right+ type Exception (Either e) = e+ raise = Left+ try = Right instance HasExceptions Maybe where- type Exception Maybe = ()- raise = const Nothing- try = Just . maybe (Left ()) Right+ type Exception Maybe = ()+ raise = const Nothing+ try = Just . maybe (Left ()) Right instance HasExceptions IO where- type Exception IO = E.SomeException- raise = E.throwIO- try = E.try----- | Catch exceptions using an exception handler.--catch :: (HasExceptions m, Monad m) => m a -> (Exception m -> m a) -> m a-catch c h = try c >>= either h return----- | Catch exceptions using an exception handler (flip 'catch').--handle :: (HasExceptions m, Monad m) => (Exception m -> m a) -> m a -> m a-handle h c = try c >>= either h return----- | Run a final computation regardless of whether an exception was--- raised.--finally :: (HasExceptions m, Monad m) => m a -> m b -> m a-finally c d = try c >>= either (\exp -> d >> raise exp) (\x -> d >> return x)+ type Exception IO = E.SomeException+ raise = E.throwIO+ try = E.try -- | Get a resource, run a computation, then release the resource, even@@ -796,10 +779,10 @@ bracket :: (HasExceptions m, Monad m) => m res -> (res -> m b) -> (res -> m a) -> m a bracket acquire release use = do- resource <- acquire- result <- try (use resource)- try (release resource)- either raise return result+ resource <- acquire+ result <- try (use resource)+ try (release resource)+ either raise return result -- | Initialize, then run, then clean up safely, even if an exception is@@ -813,20 +796,73 @@ bracket_ :: (HasExceptions m, Monad m) => m a -> m b -> m c -> m c bracket_ init cleanup run = do- init- result <- try run- try cleanup- either raise return result+ init+ result <- try run+ try cleanup+ either raise return result +-- | Catch exceptions using an exception handler.++catch :: (HasExceptions m, Monad m) => m a -> (Exception m -> m a) -> m a+catch c h = try c >>= either h return+++-- | Run a final computation regardless of whether an exception was+-- raised.++finally :: (HasExceptions m, Monad m) => m a -> m b -> m a+finally c d = try c >>= either (\exp -> d >> raise exp) (\x -> d >> return x)+++-- | Fail (in the sense of the given transformer), if the given+-- underlying computation returns 'True'.++forbid ::+ ( Exception (t m) ~ (), HasExceptions (t m),+ Monad m, Monad (t m), Transformer t ) =>+ m Bool -> t m ()+forbid = raiseWhen () . lift+++-- | Catch exceptions using an exception handler (flip 'catch').++handle :: (HasExceptions m, Monad m) => (Exception m -> m a) -> m a -> m a+handle h c = try c >>= either h return+++-- | Throw given exception, if the given computation does not return+-- 'True'.++raiseUnless :: (HasExceptions m, Monad m) => Exception m -> m Bool -> m ()+raiseUnless ex c = do b <- c; unless b (raise ex)+++-- | Throw given exception, if the given computation does not return+-- 'True'.++raiseWhen :: (HasExceptions m, Monad m) => Exception m -> m Bool -> m ()+raiseWhen ex c = do b <- c; unless b (raise ex)+++-- | Fail (in the sense of the given transformer), if the given+-- underlying computation returns 'False'.++require ::+ ( Exception (t m) ~ (), HasExceptions (t m),+ Monad m, Monad (t m), Transformer t ) =>+ m Bool -> t m ()+require = raiseUnless () . lift++ -- | Monads, which support lifting base monad computations. class LiftBase m where- -- | Base monad of @m@.- type Base m :: * -> *+ -- | Base monad of @m@.+ type Base m :: * -> * - -- | Promote a base monad computation.- base :: Base m a -> m a+ -- | Promote a base monad computation.+ base :: Base m a -> m a instance LiftBase IO where type Base IO = IO; base = id@@ -837,17 +873,17 @@ instance LiftBase ((->) r) where type Base ((->) r) = (->) r; base = id instance (LiftBase m, Monad m) => LiftBase (IdT m) where- type Base (IdT m) = Base m; base = lift . base+ type Base (IdT m) = Base m; base = lift . base instance (LiftBase m, Monad m) => LiftBase (ChoiceT r i m) where- type Base (ChoiceT r i m) = Base m; base = lift . base+ type Base (ChoiceT r i m) = Base m; base = lift . base instance (LiftBase m, Monad m) => LiftBase (ContT r m) where- type Base (ContT r m) = Base m; base = lift . base+ type Base (ContT r m) = Base m; base = lift . base instance (LiftBase m, Monad m) => LiftBase (EitherT r e m) where- type Base (EitherT r e m) = Base m; base = lift . base+ type Base (EitherT r e m) = Base m; base = lift . base instance (LiftBase m, Monad m) => LiftBase (MaybeT r m) where- type Base (MaybeT r m) = Base m; base = lift . base+ type Base (MaybeT r m) = Base m; base = lift . base instance (LiftBase m, Monad m) => LiftBase (StateT r s m) where- type Base (StateT r s m) = Base m; base = lift . base+ type Base (StateT r s m) = Base m; base = lift . base -- | Handy alias for lifting 'IO' computations.@@ -860,11 +896,11 @@ -- @m a@ can be an instance of this class. class Runnable t r m a where- -- | Arguments needed to run.- type Argument t r m a+ -- | Arguments needed to run.+ type Argument t r m a - -- | Run the transformer.- runT :: Argument t r m a -> t m a -> m r+ -- | Run the transformer.+ runT :: Argument t r m a -> t m a -> m r -- | Stateful monads.@@ -872,30 +908,30 @@ -- Minimal complete definition: 'StateOf', 'get' and 'putLazy'. class Stateful m where- -- | State type of @m@.- type StateOf m+ -- | State type of @m@.+ type StateOf m - -- | Get the current state.- get :: m (StateOf m)+ -- | Get the current state.+ get :: m (StateOf m) - -- | Set the current state and force it.- put :: StateOf m -> m ()- put x = x `seq` putLazy x+ -- | Set the current state and force it.+ put :: StateOf m -> m ()+ put x = x `seq` putLazy x - -- | Set the current state, but don't force it.- putLazy :: StateOf m -> m ()+ -- | Set the current state, but don't force it.+ putLazy :: StateOf m -> m () instance (Monad m, Stateful m) => Stateful (ContT r m) where- type StateOf (ContT r m) = StateOf m- get = lift get- put = lift . put- putLazy = lift . putLazy+ type StateOf (ContT r m) = StateOf m+ get = lift get+ put = lift . put+ putLazy = lift . putLazy instance (Monad m, Stateful m) => Stateful (EitherT r e m) where- type StateOf (EitherT r e m) = StateOf m- get = lift get- put = lift . put- putLazy = lift . putLazy+ type StateOf (EitherT r e m) = StateOf m+ get = lift get+ put = lift . put+ putLazy = lift . putLazy -- | Get a certain field.@@ -935,12 +971,13 @@ -- underlying monad to the transformer. class Transformer t where- -- | Promote a monadic computation to the transformer.- lift :: Monad m => m a -> t m a+ -- | Promote a monadic computation to the transformer.+ lift :: Monad m => m a -> t m a -- | Monads with support for logging. Traditionally these are called -- *writer monads*. class Writable m w where- tell :: w -> m ()+ -- | Log a value.+ tell :: w -> m ()
contstuff.cabal view
@@ -1,7 +1,7 @@ Name: contstuff-Version: 0.5.1-Category: Control, Monads-Synopsis: Easy to use CPS-based monads+Version: 0.6.0+Category: Control, Monads, Parsing, Text+Synopsis: Fast, easy to use CPS-based monads Maintainer: Ertugrul Söylemez <es@ertes.de> Author: Ertugrul Söylemez <es@ertes.de> Copyright: (c) 2010 Ertugrul Söylemez@@ -12,8 +12,10 @@ Stability: experimental Cabal-version: >= 1.6 Description:- This library implements easy to use CPS-based monads. + This library implements fast and easy to use CPS-based monad+ transformers. Most of the usual monads are implemented.+ Library Build-depends: base >= 4 && <= 5@@ -24,6 +26,7 @@ TypeFamilies Exposed-modules: Control.ContStuff+-- Text.ContParser --Executable test -- Build-depends: