{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Control.Monad.Label where
import Control.Applicative (Applicative(pure, (<*>)), Alternative, )
import Control.Monad (MonadPlus, )
import Control.Monad.Fix (MonadFix)
import Control.Monad.IO.Class (MonadIO, )
import Control.Monad.Trans.Class (MonadTrans, )
import qualified Control.Monad.Trans.Reader as Reader
import Control.Monad.Trans.Reader (Reader, ReaderT(ReaderT), runReader, runReaderT, )
newtype Label l a = Label { forall l a. Label l a -> Reader [l] a
runLabelPriv :: Reader [l] a }
deriving (forall a b. a -> Label l b -> Label l a
forall a b. (a -> b) -> Label l a -> Label l b
forall l a b. a -> Label l b -> Label l a
forall l a b. (a -> b) -> Label l a -> Label l b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Label l b -> Label l a
$c<$ :: forall l a b. a -> Label l b -> Label l a
fmap :: forall a b. (a -> b) -> Label l a -> Label l b
$cfmap :: forall l a b. (a -> b) -> Label l a -> Label l b
Functor, forall l. Functor (Label l)
forall a. a -> Label l a
forall l a. a -> Label l a
forall a b. Label l a -> Label l b -> Label l a
forall a b. Label l a -> Label l b -> Label l b
forall a b. Label l (a -> b) -> Label l a -> Label l b
forall l a b. Label l a -> Label l b -> Label l a
forall l a b. Label l a -> Label l b -> Label l b
forall l a b. Label l (a -> b) -> Label l a -> Label l b
forall a b c. (a -> b -> c) -> Label l a -> Label l b -> Label l c
forall l a b c.
(a -> b -> c) -> Label l a -> Label l b -> Label l c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. Label l a -> Label l b -> Label l a
$c<* :: forall l a b. Label l a -> Label l b -> Label l a
*> :: forall a b. Label l a -> Label l b -> Label l b
$c*> :: forall l a b. Label l a -> Label l b -> Label l b
liftA2 :: forall a b c. (a -> b -> c) -> Label l a -> Label l b -> Label l c
$cliftA2 :: forall l a b c.
(a -> b -> c) -> Label l a -> Label l b -> Label l c
<*> :: forall a b. Label l (a -> b) -> Label l a -> Label l b
$c<*> :: forall l a b. Label l (a -> b) -> Label l a -> Label l b
pure :: forall a. a -> Label l a
$cpure :: forall l a. a -> Label l a
Applicative, forall l. Applicative (Label l)
forall a. a -> Label l a
forall l a. a -> Label l a
forall a b. Label l a -> Label l b -> Label l b
forall a b. Label l a -> (a -> Label l b) -> Label l b
forall l a b. Label l a -> Label l b -> Label l b
forall l a b. Label l a -> (a -> Label l b) -> Label l b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> Label l a
$creturn :: forall l a. a -> Label l a
>> :: forall a b. Label l a -> Label l b -> Label l b
$c>> :: forall l a b. Label l a -> Label l b -> Label l b
>>= :: forall a b. Label l a -> (a -> Label l b) -> Label l b
$c>>= :: forall l a b. Label l a -> (a -> Label l b) -> Label l b
Monad, forall l. Monad (Label l)
forall a. (a -> Label l a) -> Label l a
forall l a. (a -> Label l a) -> Label l a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: forall a. (a -> Label l a) -> Label l a
$cmfix :: forall l a. (a -> Label l a) -> Label l a
MonadFix)
runLabel :: Label l a -> [l] -> a
runLabel :: forall l a. Label l a -> [l] -> a
runLabel = forall r a. Reader r a -> r -> a
runReader forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall l a. Label l a -> Reader [l] a
runLabelPriv
ask :: Label l [l]
ask :: forall l. Label l [l]
ask = forall l a. Reader [l] a -> Label l a
Label forall (m :: * -> *) r. Monad m => ReaderT r m r
Reader.ask
local :: l -> Label l a -> Label l a
local :: forall l a. l -> Label l a -> Label l a
local l
l Label l a
m = forall l a. Reader [l] a -> Label l a
Label forall a b. (a -> b) -> a -> b
$ forall r (m :: * -> *) a.
(r -> r) -> ReaderT r m a -> ReaderT r m a
Reader.local (l
lforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ forall l a. Label l a -> Reader [l] a
runLabelPriv Label l a
m
newtype LabelT l m a = LabelT { forall l (m :: * -> *) a. LabelT l m a -> ReaderT [l] m a
runLabelPrivT :: ReaderT [l] m a }
deriving (forall a. LabelT l m a
forall a. LabelT l m a -> LabelT l m [a]
forall a. LabelT l m a -> LabelT l m a -> LabelT l m a
forall {l} {m :: * -> *}. Alternative m => Applicative (LabelT l m)
forall l (m :: * -> *) a. Alternative m => LabelT l m a
forall l (m :: * -> *) a.
Alternative m =>
LabelT l m a -> LabelT l m [a]
forall l (m :: * -> *) a.
Alternative m =>
LabelT l m a -> LabelT l m a -> LabelT l m a
forall (f :: * -> *).
Applicative f
-> (forall a. f a)
-> (forall a. f a -> f a -> f a)
-> (forall a. f a -> f [a])
-> (forall a. f a -> f [a])
-> Alternative f
many :: forall a. LabelT l m a -> LabelT l m [a]
$cmany :: forall l (m :: * -> *) a.
Alternative m =>
LabelT l m a -> LabelT l m [a]
some :: forall a. LabelT l m a -> LabelT l m [a]
$csome :: forall l (m :: * -> *) a.
Alternative m =>
LabelT l m a -> LabelT l m [a]
<|> :: forall a. LabelT l m a -> LabelT l m a -> LabelT l m a
$c<|> :: forall l (m :: * -> *) a.
Alternative m =>
LabelT l m a -> LabelT l m a -> LabelT l m a
empty :: forall a. LabelT l m a
$cempty :: forall l (m :: * -> *) a. Alternative m => LabelT l m a
Alternative, forall a. a -> LabelT l m a
forall a b. LabelT l m a -> LabelT l m b -> LabelT l m b
forall a b. LabelT l m a -> (a -> LabelT l m b) -> LabelT l m b
forall {l} {m :: * -> *}. Monad m => Applicative (LabelT l m)
forall l (m :: * -> *) a. Monad m => a -> LabelT l m a
forall l (m :: * -> *) a b.
Monad m =>
LabelT l m a -> LabelT l m b -> LabelT l m b
forall l (m :: * -> *) a b.
Monad m =>
LabelT l m a -> (a -> LabelT l m b) -> LabelT l m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> LabelT l m a
$creturn :: forall l (m :: * -> *) a. Monad m => a -> LabelT l m a
>> :: forall a b. LabelT l m a -> LabelT l m b -> LabelT l m b
$c>> :: forall l (m :: * -> *) a b.
Monad m =>
LabelT l m a -> LabelT l m b -> LabelT l m b
>>= :: forall a b. LabelT l m a -> (a -> LabelT l m b) -> LabelT l m b
$c>>= :: forall l (m :: * -> *) a b.
Monad m =>
LabelT l m a -> (a -> LabelT l m b) -> LabelT l m b
Monad, forall a. LabelT l m a
forall a. LabelT l m a -> LabelT l m a -> LabelT l m a
forall {l} {m :: * -> *}. MonadPlus m => Monad (LabelT l m)
forall {l} {m :: * -> *}. MonadPlus m => Alternative (LabelT l m)
forall l (m :: * -> *) a. MonadPlus m => LabelT l m a
forall l (m :: * -> *) a.
MonadPlus m =>
LabelT l m a -> LabelT l m a -> LabelT l m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: forall a. LabelT l m a -> LabelT l m a -> LabelT l m a
$cmplus :: forall l (m :: * -> *) a.
MonadPlus m =>
LabelT l m a -> LabelT l m a -> LabelT l m a
mzero :: forall a. LabelT l m a
$cmzero :: forall l (m :: * -> *) a. MonadPlus m => LabelT l m a
MonadPlus, forall a. (a -> LabelT l m a) -> LabelT l m a
forall {l} {m :: * -> *}. MonadFix m => Monad (LabelT l m)
forall l (m :: * -> *) a.
MonadFix m =>
(a -> LabelT l m a) -> LabelT l m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: forall a. (a -> LabelT l m a) -> LabelT l m a
$cmfix :: forall l (m :: * -> *) a.
MonadFix m =>
(a -> LabelT l m a) -> LabelT l m a
MonadFix, forall l (m :: * -> *) a. Monad m => m a -> LabelT l m a
forall (m :: * -> *) a. Monad m => m a -> LabelT l m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: forall (m :: * -> *) a. Monad m => m a -> LabelT l m a
$clift :: forall l (m :: * -> *) a. Monad m => m a -> LabelT l m a
MonadTrans, forall a. IO a -> LabelT l m a
forall {l} {m :: * -> *}. MonadIO m => Monad (LabelT l m)
forall l (m :: * -> *) a. MonadIO m => IO a -> LabelT l m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: forall a. IO a -> LabelT l m a
$cliftIO :: forall l (m :: * -> *) a. MonadIO m => IO a -> LabelT l m a
MonadIO)
fmapReaderT :: (Functor f) =>
(a -> b) -> ReaderT r f a -> ReaderT r f b
fmapReaderT :: forall (f :: * -> *) a b r.
Functor f =>
(a -> b) -> ReaderT r f a -> ReaderT r f b
fmapReaderT a -> b
f ReaderT r f a
m = forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT forall a b. (a -> b) -> a -> b
$ \r
l -> forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f forall a b. (a -> b) -> a -> b
$ forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT r f a
m r
l
instance (Functor m) => Functor (LabelT l m) where
fmap :: forall a b. (a -> b) -> LabelT l m a -> LabelT l m b
fmap a -> b
f LabelT l m a
m = forall l (m :: * -> *) a. ReaderT [l] m a -> LabelT l m a
LabelT forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b r.
Functor f =>
(a -> b) -> ReaderT r f a -> ReaderT r f b
fmapReaderT a -> b
f forall a b. (a -> b) -> a -> b
$ forall l (m :: * -> *) a. LabelT l m a -> ReaderT [l] m a
runLabelPrivT LabelT l m a
m
pureReaderT :: (Applicative f) =>
a -> ReaderT r f a
pureReaderT :: forall (f :: * -> *) a r. Applicative f => a -> ReaderT r f a
pureReaderT a
a = forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT forall a b. (a -> b) -> a -> b
$ forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a
apReaderT :: (Applicative f) =>
ReaderT r f (a -> b) ->
ReaderT r f a ->
ReaderT r f b
apReaderT :: forall (f :: * -> *) r a b.
Applicative f =>
ReaderT r f (a -> b) -> ReaderT r f a -> ReaderT r f b
apReaderT ReaderT r f (a -> b)
f ReaderT r f a
x = forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT forall a b. (a -> b) -> a -> b
$ \r
r -> forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT r f (a -> b)
f r
r forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT r f a
x r
r
instance Applicative m => Applicative (LabelT l m) where
pure :: forall a. a -> LabelT l m a
pure a
a = forall l (m :: * -> *) a. ReaderT [l] m a -> LabelT l m a
LabelT forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a r. Applicative f => a -> ReaderT r f a
pureReaderT a
a
LabelT l m (a -> b)
f <*> :: forall a b. LabelT l m (a -> b) -> LabelT l m a -> LabelT l m b
<*> LabelT l m a
x = forall l (m :: * -> *) a. ReaderT [l] m a -> LabelT l m a
LabelT forall a b. (a -> b) -> a -> b
$ forall l (m :: * -> *) a. LabelT l m a -> ReaderT [l] m a
runLabelPrivT LabelT l m (a -> b)
f forall (f :: * -> *) r a b.
Applicative f =>
ReaderT r f (a -> b) -> ReaderT r f a -> ReaderT r f b
`apReaderT` forall l (m :: * -> *) a. LabelT l m a -> ReaderT [l] m a
runLabelPrivT LabelT l m a
x
runLabelT :: Monad m => LabelT l m a -> [l] -> m a
runLabelT :: forall (m :: * -> *) l a. Monad m => LabelT l m a -> [l] -> m a
runLabelT = forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall l (m :: * -> *) a. LabelT l m a -> ReaderT [l] m a
runLabelPrivT
askT :: Monad m => LabelT l m [l]
askT :: forall (m :: * -> *) l. Monad m => LabelT l m [l]
askT = forall l (m :: * -> *) a. ReaderT [l] m a -> LabelT l m a
LabelT forall (m :: * -> *) r. Monad m => ReaderT r m r
Reader.ask
localT :: Monad m => l -> LabelT l m a -> LabelT l m a
localT :: forall (m :: * -> *) l a.
Monad m =>
l -> LabelT l m a -> LabelT l m a
localT l
l LabelT l m a
m = forall l (m :: * -> *) a. ReaderT [l] m a -> LabelT l m a
LabelT forall a b. (a -> b) -> a -> b
$ forall r (m :: * -> *) a.
(r -> r) -> ReaderT r m a -> ReaderT r m a
Reader.local (l
lforall a. a -> [a] -> [a]
:) forall a b. (a -> b) -> a -> b
$ forall l (m :: * -> *) a. LabelT l m a -> ReaderT [l] m a
runLabelPrivT LabelT l m a
m