fraxl-0.2.0.0: Cached and parallel data fetching.

Safe HaskellSafe
LanguageHaskell2010

Control.Monad.Trans.Fraxl.Free

Contents

Synopsis

The base functor

data FreeF f m a where Source #

The base functor for a free monad.

Constructors

Pure :: a -> FreeF f m a 
Free :: f b -> FastTCQueue (Kleisli (FreeT f m)) b a -> FreeF f m a 
Instances
(Applicative f, Monad m) => Functor (FreeF f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

fmap :: (a -> b) -> FreeF f m a -> FreeF f m b #

(<$) :: a -> FreeF f m b -> FreeF f m a #

The free monad transformer

newtype FreeT f m a Source #

The "free monad transformer" for an applicative functor f

Constructors

FreeT 

Fields

Instances
(Applicative f, Monad m) => MonadFree f (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

wrap :: f (FreeT f m a) -> FreeT f m a #

(Applicative f, MonadWriter w m) => MonadWriter w (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

writer :: (a, w) -> FreeT f m a #

tell :: w -> FreeT f m () #

listen :: FreeT f m a -> FreeT f m (a, w) #

pass :: FreeT f m (a, w -> w) -> FreeT f m a #

(Applicative f, MonadState s m) => MonadState s (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

get :: FreeT f m s #

put :: s -> FreeT f m () #

state :: (s -> (a, s)) -> FreeT f m a #

(Applicative f, MonadReader r m) => MonadReader r (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

ask :: FreeT f m r #

local :: (r -> r) -> FreeT f m a -> FreeT f m a #

reader :: (r -> a) -> FreeT f m a #

(Applicative f, MonadError e m) => MonadError e (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

throwError :: e -> FreeT f m a #

catchError :: FreeT f m a -> (e -> FreeT f m a) -> FreeT f m a #

Monad m => MonadFraxl f (FreerT f m) Source # 
Instance details

Defined in Control.Monad.Fraxl.Class

Methods

dataFetch :: f a -> FreerT f m a Source #

(Monad m, f r) => MonadFraxl f (Fraxl r m) Source # 
Instance details

Defined in Control.Monad.Fraxl.Class

Methods

dataFetch :: f a -> Fraxl r m a Source #

MonadTrans (FreeT f) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

lift :: Monad m => m a -> FreeT f m a #

(Applicative f, Monad m) => Monad (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

(>>=) :: FreeT f m a -> (a -> FreeT f m b) -> FreeT f m b #

(>>) :: FreeT f m a -> FreeT f m b -> FreeT f m b #

return :: a -> FreeT f m a #

fail :: String -> FreeT f m a #

(Applicative f, Monad m) => Functor (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

fmap :: (a -> b) -> FreeT f m a -> FreeT f m b #

(<$) :: a -> FreeT f m b -> FreeT f m a #

(Applicative f, Monad m) => Applicative (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

pure :: a -> FreeT f m a #

(<*>) :: FreeT f m (a -> b) -> FreeT f m a -> FreeT f m b #

liftA2 :: (a -> b -> c) -> FreeT f m a -> FreeT f m b -> FreeT f m c #

(*>) :: FreeT f m a -> FreeT f m b -> FreeT f m b #

(<*) :: FreeT f m a -> FreeT f m b -> FreeT f m a #

(Applicative f, MonadIO m) => MonadIO (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

liftIO :: IO a -> FreeT f m a #

(Applicative f, MonadPlus m) => Alternative (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

empty :: FreeT f m a #

(<|>) :: FreeT f m a -> FreeT f m a -> FreeT f m a #

some :: FreeT f m a -> FreeT f m [a] #

many :: FreeT f m a -> FreeT f m [a] #

(Applicative f, MonadPlus m) => MonadPlus (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

mzero :: FreeT f m a #

mplus :: FreeT f m a -> FreeT f m a -> FreeT f m a #

(Applicative f, MonadThrow m) => MonadThrow (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

throwM :: Exception e => e -> FreeT f m a #

(Applicative f, MonadCatch m) => MonadCatch (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

catch :: Exception e => FreeT f m a -> (e -> FreeT f m a) -> FreeT f m a #

(Applicative f, MonadCont m) => MonadCont (FreeT f m) Source # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

callCC :: ((a -> FreeT f m b) -> FreeT f m a) -> FreeT f m a #

The free monad

type Free f = FreeT f Identity Source #

The "free monad" for an applicative functor f.

Operations

liftF :: (Functor f, MonadFree f m) => f a -> m a #

A version of lift that can be used with just a Functor for f.

iterT :: (Applicative f, Monad m) => (f (m a) -> m a) -> FreeT f m a -> m a Source #

Tear down a free monad transformer using iteration.

iterTM :: (Applicative f, Monad m, MonadTrans t, Monad (t m)) => (f (t m a) -> t m a) -> FreeT f m a -> t m a Source #

Tear down a free monad transformer using iteration over a transformer.

hoistFreeT :: (Monad m, Applicative f) => (forall a. m a -> n a) -> FreeT f m b -> FreeT f n b Source #

Lift a monad homomorphism from m to n into a monad homomorphism from FreeT f m to FreeT f n

hoistFreeT :: (Monad m, Functor f) => (m ~> n) -> FreeT f m ~> FreeT f n

transFreeT :: (Applicative f, Monad m) => (forall a. f a -> g a) -> FreeT f m b -> FreeT g m b Source #

Lift a natural transformation from f to g into a monad homomorphism from FreeT f m to FreeT g m

joinFreeT :: forall m f a. (Monad m, Traversable f, Applicative f) => FreeT f m a -> m (Free f a) Source #

Pull out and join m layers of FreeT f m a.

retractT :: (MonadTrans t, Monad (t m), Monad m) => FreeT (t m) m a -> t m a Source #

Tear down a free monad transformer using Monad instance for t m.

Operations of free monad

retract :: Monad f => Free f a -> f a Source #

retract is the left inverse of liftF

retract . liftF = id

iter :: Applicative f => (f a -> a) -> Free f a -> a Source #

Tear down a Free Monad using iteration.

iterM :: (Applicative f, Monad m) => (f (m a) -> m a) -> Free f a -> m a Source #

Like iter for monadic values.

Free Monads With Class

class Monad m => MonadFree (f :: * -> *) (m :: * -> *) | m -> f where #

Monads provide substitution (fmap) and renormalization (join):

m >>= f = join (fmap f m)

A free Monad is one that does no work during the normalization step beyond simply grafting the two monadic values together.

[] is not a free Monad (in this sense) because join [[a]] smashes the lists flat.

On the other hand, consider:

data Tree a = Bin (Tree a) (Tree a) | Tip a
instance Monad Tree where
  return = Tip
  Tip a >>= f = f a
  Bin l r >>= f = Bin (l >>= f) (r >>= f)

This Monad is the free Monad of Pair:

data Pair a = Pair a a

And we could make an instance of MonadFree for it directly:

instance MonadFree Pair Tree where
   wrap (Pair l r) = Bin l r

Or we could choose to program with Free Pair instead of Tree and thereby avoid having to define our own Monad instance.

Moreover, Control.Monad.Free.Church provides a MonadFree instance that can improve the asymptotic complexity of code that constructs free monads by effectively reassociating the use of (>>=). You may also want to take a look at the kan-extensions package (http://hackage.haskell.org/package/kan-extensions).

See Free for a more formal definition of the free Monad for a Functor.

Methods

wrap :: f (m a) -> m a #

Add a layer.

wrap (fmap f x) ≡ wrap (fmap return x) >>= f
Instances
(Functor f, MonadFree f m) => MonadFree f (MaybeT m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (MaybeT m a) -> MaybeT m a #

(Functor f, MonadFree f m) => MonadFree f (ListT m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (ListT m a) -> ListT m a #

(Applicative f, Monad m) => MonadFree f (FreeT f m) # 
Instance details

Defined in Control.Monad.Trans.Fraxl.Free

Methods

wrap :: f (FreeT f m a) -> FreeT f m a #

(Functor f, MonadFree f m, Monoid w) => MonadFree f (WriterT w m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (WriterT w m a) -> WriterT w m a #

(Functor f, MonadFree f m, Monoid w) => MonadFree f (WriterT w m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (WriterT w m a) -> WriterT w m a #

(Functor f, MonadFree f m) => MonadFree f (StateT s m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (StateT s m a) -> StateT s m a #

(Functor f, MonadFree f m) => MonadFree f (StateT s m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (StateT s m a) -> StateT s m a #

(Functor f, MonadFree f m) => MonadFree f (IdentityT m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (IdentityT m a) -> IdentityT m a #

(Functor f, MonadFree f m) => MonadFree f (ExceptT e m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (ExceptT e m a) -> ExceptT e m a #

(Functor f, MonadFree f m, Error e) => MonadFree f (ErrorT e m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (ErrorT e m a) -> ErrorT e m a #

(Functor f, MonadFree f m) => MonadFree f (ReaderT e m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (ReaderT e m a) -> ReaderT e m a #

(Functor f, MonadFree f m) => MonadFree f (ContT r m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (ContT r m a) -> ContT r m a #

(Functor f, MonadFree f m, Monoid w) => MonadFree f (RWST r w s m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (RWST r w s m a) -> RWST r w s m a #

(Functor f, MonadFree f m, Monoid w) => MonadFree f (RWST r w s m) 
Instance details

Defined in Control.Monad.Free.Class

Methods

wrap :: f (RWST r w s m a) -> RWST r w s m a #