turtle-1.1.0: Shell programming, Haskell-style

Safe HaskellSafe-Inferred
LanguageHaskell2010

Turtle.Shell

Contents

Description

You can think of Shell as [] + IO + Managed. In fact, you can embed all three of them within a Shell:

select ::        [a] -> Shell a
liftIO ::      IO a  -> Shell a
using  :: Managed a  -> Shell a

Those three embeddings obey these laws:

do { x <- select m; select (f x) } = select (do { x <- m; f x })
do { x <- liftIO m; liftIO (f x) } = liftIO (do { x <- m; f x })
do { x <- with   m; using  (f x) } = using  (do { x <- m; f x })

select (return x) = return x
liftIO (return x) = return x
using  (return x) = return x

... and select obeys these additional laws:

select xs <|> select ys = select (xs <|> ys)
select empty = empty

You typically won't build Shells using the Shell constructor. Instead, use these functions to generate primitive Shells:

-- For every shell `s`:
foldIO s (FoldM step begin done) = do
    x  <- begin
    x' <- foldIO s (FoldM step (return x) return)
    done x'

... which is a fancy way of saying that your Shell must call 'begin' exactly once when it begins and call 'done' exactly once when it ends.

Synopsis

Shell

newtype Shell a Source

A (Shell a) is a protected stream of a's with side effects

Constructors

Shell 

Fields

foldIO :: forall r. FoldM IO a r -> IO r
 

fold :: Shell a -> Fold a b -> IO b Source

Use a Fold to reduce the stream of a's produced by a Shell

sh :: Shell a -> IO () Source

Run a Shell to completion, discarding any unused values

view :: Show a => Shell a -> IO () Source

Run a Shell to completion, printing any unused values

Embeddings

select :: [a] -> Shell a Source

Convert a list to a Shell that emits each element of the list

liftIO :: MonadIO m => forall a. IO a -> m a

Lift a computation from the IO monad.

using :: Managed a -> Shell a Source

Acquire a Managed resource within a Shell in an exception-safe way