| Copyright | (c) Joseph Adams 2012 |
|---|---|
| License | BSD3 |
| Maintainer | joeyadams3.14159@gmail.com |
| Safe Haskell | Safe-Inferred |
| Language | Haskell98 |
Control.Monad.Trans.Loop
Description
Synopsis
- newtype LoopT c e m a = LoopT {
- runLoopT :: forall r. (c -> m r) -> (e -> m r) -> (a -> m r) -> m r
- stepLoopT :: Monad m => LoopT c e m c -> (c -> m e) -> m e
- continue :: LoopT () e m a
- exit :: LoopT c () m a
- continueWith :: c -> LoopT c e m a
- exitWith :: e -> LoopT c e m a
- foreach :: Monad m => [a] -> (a -> LoopT c () m c) -> m ()
- while :: Monad m => m Bool -> LoopT c () m c -> m ()
- doWhile :: Monad m => LoopT a a m a -> m Bool -> m a
- once :: Monad m => LoopT a a m a -> m a
- repeatLoopT :: Monad m => LoopT c e m a -> m e
- iterateLoopT :: Monad m => c -> (c -> LoopT c e m c) -> m e
- liftLocalLoopT :: Monad m => (forall a. m a -> m a) -> LoopT c e m b -> LoopT c e m b
The LoopT monad transformer
newtype LoopT c e m a Source #
LoopT is a monad transformer for the loop body. It provides two
capabilities:
Instances
| MonadBase b m => MonadBase b (LoopT c e m) Source # | |
Defined in Control.Monad.Trans.Loop | |
| MonadTrans (LoopT c e) Source # | |
| MonadIO m => MonadIO (LoopT c e m) Source # | |
| Applicative (LoopT c e m) Source # | |
Defined in Control.Monad.Trans.Loop Methods pure :: a -> LoopT c e m a Source # (<*>) :: LoopT c e m (a -> b) -> LoopT c e m a -> LoopT c e m b Source # liftA2 :: (a -> b -> c0) -> LoopT c e m a -> LoopT c e m b -> LoopT c e m c0 Source # (*>) :: LoopT c e m a -> LoopT c e m b -> LoopT c e m b Source # (<*) :: LoopT c e m a -> LoopT c e m b -> LoopT c e m a Source # | |
| Functor (LoopT c e m) Source # | |
| Monad (LoopT c e m) Source # | |
stepLoopT :: Monad m => LoopT c e m c -> (c -> m e) -> m e Source #
Call a loop body, passing it a continuation for the next iteration.
This can be used to construct custom looping constructs. For example,
here is the definition of foreach:
foreach list body = loop list
where loop [] = return ()
loop (x:xs) = stepLoopT (body x) (\_ -> loop xs)continue and exit
continueWith :: c -> LoopT c e m a Source #
Like continue, but return a value from the loop body.
exitWith :: e -> LoopT c e m a Source #
Like exit, but return a value from the loop as a whole.
See the documentation of iterateLoopT for an example.
Looping constructs
while :: Monad m => m Bool -> LoopT c () m c -> m () Source #
Repeat the loop body while the predicate holds. Like a while loop in C,
the condition is tested first.
repeatLoopT :: Monad m => LoopT c e m a -> m e Source #
Execute the loop body again and again. The only way to exit repeatLoopT
is to call exit or exitWith.
iterateLoopT :: Monad m => c -> (c -> LoopT c e m c) -> m e Source #
Call the loop body again and again, passing it the result of the previous
iteration each time around. The only way to exit iterateLoopT is to call
exit or exitWith.
Example:
count :: Int -> IO Int
count n = iterateLoopT 0 $ \i ->
if i < n
then do
lift $ print i
return $ i+1
else exitWith i