Copyright | © 2021 Evan Relf |
---|---|
License | BSD-3-Clause |
Maintainer | evan@evanrelf.com |
Stability | experimental |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Documentation
:: Monad m | |
=> s | Initial state |
-> (s -> m (Either s a)) | Action to perform, returning either a new state to continue looping, or a final value to stop looping. |
-> m a |
Loop indefinitely with state. Use forever
for stateless
infinite loops.
Example
counter :: Process NoMsg () counter = loop (10 :: Int) \count -> do liftIO $ print count if count > 0 then continue (count - 1) else exit ()
Since: 0.3.0.0
continue :: Monad m => s -> m (Either s a) Source #
Continue looping with some new state.
continue s = pure (Left s)
Since: 0.3.0.0
stop :: Monad m => a -> m (Either s a) Source #
Stop looping and return with a final value.
exit x = pure (Right x)
Since: 0.3.0.0
Re-exports
forever :: Applicative f => f a -> f b #
Repeat an action indefinitely.
Using ApplicativeDo
: '
' can be understood as the
pseudo-forever
asdo
expression
do as as ..
with as
repeating.
Examples
A common use of forever
is to process input from network sockets,
Handle
s, and channels
(e.g. MVar
and
Chan
).
For example, here is how we might implement an echo
server, using
forever
both to listen for client connections on a network socket
and to echo client input on client connection handles:
echoServer :: Socket -> IO () echoServer socket =forever
$ do client <- accept socketforkFinally
(echo client) (\_ -> hClose client) where echo :: Handle -> IO () echo client =forever
$ hGetLine client >>= hPutStrLn client