{-# LANGUAGE DerivingVia #-}
{-# OPTIONS_HADDOCK not-home #-}
module Control.Effect.Internal.Writer where
import Data.Coerce
import Data.Tuple (swap)
import Control.Applicative
import Control.Monad
import Control.Effect
import Control.Effect.Bracket
import Control.Effect.Type.ListenPrim
import Control.Effect.Type.WriterPrim
import Control.Effect.Carrier
import Control.Monad.Trans.Control hiding (embed)
import qualified Control.Monad.Catch as C
import Control.Monad.Trans.Writer.CPS (WriterT, writerT, runWriterT)
import qualified Control.Monad.Trans.Writer.CPS as W
import qualified Control.Monad.Trans.Writer.Lazy as LW
import Control.Effect.Internal.Utils
data Tell s m a where
Tell :: s -> Tell s m ()
data Listen s m a where
Listen :: m a -> Listen s m (s, a)
data Pass s m a where
Pass :: m (s -> s, a) -> Pass s m a
newtype TellC s m a = TellC {
TellC s m a -> WriterT s m a
unTellC :: WriterT s m a
}
deriving ( a -> TellC s m b -> TellC s m a
(a -> b) -> TellC s m a -> TellC s m b
(forall a b. (a -> b) -> TellC s m a -> TellC s m b)
-> (forall a b. a -> TellC s m b -> TellC s m a)
-> Functor (TellC s m)
forall a b. a -> TellC s m b -> TellC s m a
forall a b. (a -> b) -> TellC s m a -> TellC s m b
forall s (m :: * -> *) a b.
Functor m =>
a -> TellC s m b -> TellC s m a
forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> TellC s m a -> TellC s m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> TellC s m b -> TellC s m a
$c<$ :: forall s (m :: * -> *) a b.
Functor m =>
a -> TellC s m b -> TellC s m a
fmap :: (a -> b) -> TellC s m a -> TellC s m b
$cfmap :: forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> TellC s m a -> TellC s m b
Functor, Functor (TellC s m)
a -> TellC s m a
Functor (TellC s m)
-> (forall a. a -> TellC s m a)
-> (forall a b. TellC s m (a -> b) -> TellC s m a -> TellC s m b)
-> (forall a b c.
(a -> b -> c) -> TellC s m a -> TellC s m b -> TellC s m c)
-> (forall a b. TellC s m a -> TellC s m b -> TellC s m b)
-> (forall a b. TellC s m a -> TellC s m b -> TellC s m a)
-> Applicative (TellC s m)
TellC s m a -> TellC s m b -> TellC s m b
TellC s m a -> TellC s m b -> TellC s m a
TellC s m (a -> b) -> TellC s m a -> TellC s m b
(a -> b -> c) -> TellC s m a -> TellC s m b -> TellC s m c
forall a. a -> TellC s m a
forall a b. TellC s m a -> TellC s m b -> TellC s m a
forall a b. TellC s m a -> TellC s m b -> TellC s m b
forall a b. TellC s m (a -> b) -> TellC s m a -> TellC s m b
forall a b c.
(a -> b -> c) -> TellC s m a -> TellC s m b -> TellC s m c
forall s (m :: * -> *). Monad m => Functor (TellC s m)
forall s (m :: * -> *) a. Monad m => a -> TellC s m a
forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> TellC s m b -> TellC s m a
forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> TellC s m b -> TellC s m b
forall s (m :: * -> *) a b.
Monad m =>
TellC s m (a -> b) -> TellC s m a -> TellC s m b
forall s (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> TellC s m a -> TellC s m b -> TellC s m 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
<* :: TellC s m a -> TellC s m b -> TellC s m a
$c<* :: forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> TellC s m b -> TellC s m a
*> :: TellC s m a -> TellC s m b -> TellC s m b
$c*> :: forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> TellC s m b -> TellC s m b
liftA2 :: (a -> b -> c) -> TellC s m a -> TellC s m b -> TellC s m c
$cliftA2 :: forall s (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> TellC s m a -> TellC s m b -> TellC s m c
<*> :: TellC s m (a -> b) -> TellC s m a -> TellC s m b
$c<*> :: forall s (m :: * -> *) a b.
Monad m =>
TellC s m (a -> b) -> TellC s m a -> TellC s m b
pure :: a -> TellC s m a
$cpure :: forall s (m :: * -> *) a. Monad m => a -> TellC s m a
$cp1Applicative :: forall s (m :: * -> *). Monad m => Functor (TellC s m)
Applicative, Applicative (TellC s m)
a -> TellC s m a
Applicative (TellC s m)
-> (forall a b. TellC s m a -> (a -> TellC s m b) -> TellC s m b)
-> (forall a b. TellC s m a -> TellC s m b -> TellC s m b)
-> (forall a. a -> TellC s m a)
-> Monad (TellC s m)
TellC s m a -> (a -> TellC s m b) -> TellC s m b
TellC s m a -> TellC s m b -> TellC s m b
forall a. a -> TellC s m a
forall a b. TellC s m a -> TellC s m b -> TellC s m b
forall a b. TellC s m a -> (a -> TellC s m b) -> TellC s m b
forall s (m :: * -> *). Monad m => Applicative (TellC s m)
forall s (m :: * -> *) a. Monad m => a -> TellC s m a
forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> TellC s m b -> TellC s m b
forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> (a -> TellC s m b) -> TellC s 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 :: a -> TellC s m a
$creturn :: forall s (m :: * -> *) a. Monad m => a -> TellC s m a
>> :: TellC s m a -> TellC s m b -> TellC s m b
$c>> :: forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> TellC s m b -> TellC s m b
>>= :: TellC s m a -> (a -> TellC s m b) -> TellC s m b
$c>>= :: forall s (m :: * -> *) a b.
Monad m =>
TellC s m a -> (a -> TellC s m b) -> TellC s m b
$cp1Monad :: forall s (m :: * -> *). Monad m => Applicative (TellC s m)
Monad
, Applicative (TellC s m)
TellC s m a
Applicative (TellC s m)
-> (forall a. TellC s m a)
-> (forall a. TellC s m a -> TellC s m a -> TellC s m a)
-> (forall a. TellC s m a -> TellC s m [a])
-> (forall a. TellC s m a -> TellC s m [a])
-> Alternative (TellC s m)
TellC s m a -> TellC s m a -> TellC s m a
TellC s m a -> TellC s m [a]
TellC s m a -> TellC s m [a]
forall a. TellC s m a
forall a. TellC s m a -> TellC s m [a]
forall a. TellC s m a -> TellC s m a -> TellC s m a
forall s (m :: * -> *). MonadPlus m => Applicative (TellC s m)
forall s (m :: * -> *) a. MonadPlus m => TellC s m a
forall s (m :: * -> *) a.
MonadPlus m =>
TellC s m a -> TellC s m [a]
forall s (m :: * -> *) a.
MonadPlus m =>
TellC s m a -> TellC s m a -> TellC s 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 :: TellC s m a -> TellC s m [a]
$cmany :: forall s (m :: * -> *) a.
MonadPlus m =>
TellC s m a -> TellC s m [a]
some :: TellC s m a -> TellC s m [a]
$csome :: forall s (m :: * -> *) a.
MonadPlus m =>
TellC s m a -> TellC s m [a]
<|> :: TellC s m a -> TellC s m a -> TellC s m a
$c<|> :: forall s (m :: * -> *) a.
MonadPlus m =>
TellC s m a -> TellC s m a -> TellC s m a
empty :: TellC s m a
$cempty :: forall s (m :: * -> *) a. MonadPlus m => TellC s m a
$cp1Alternative :: forall s (m :: * -> *). MonadPlus m => Applicative (TellC s m)
Alternative, Monad (TellC s m)
Alternative (TellC s m)
TellC s m a
Alternative (TellC s m)
-> Monad (TellC s m)
-> (forall a. TellC s m a)
-> (forall a. TellC s m a -> TellC s m a -> TellC s m a)
-> MonadPlus (TellC s m)
TellC s m a -> TellC s m a -> TellC s m a
forall a. TellC s m a
forall a. TellC s m a -> TellC s m a -> TellC s m a
forall s (m :: * -> *). MonadPlus m => Monad (TellC s m)
forall s (m :: * -> *). MonadPlus m => Alternative (TellC s m)
forall s (m :: * -> *) a. MonadPlus m => TellC s m a
forall s (m :: * -> *) a.
MonadPlus m =>
TellC s m a -> TellC s m a -> TellC s m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: TellC s m a -> TellC s m a -> TellC s m a
$cmplus :: forall s (m :: * -> *) a.
MonadPlus m =>
TellC s m a -> TellC s m a -> TellC s m a
mzero :: TellC s m a
$cmzero :: forall s (m :: * -> *) a. MonadPlus m => TellC s m a
$cp2MonadPlus :: forall s (m :: * -> *). MonadPlus m => Monad (TellC s m)
$cp1MonadPlus :: forall s (m :: * -> *). MonadPlus m => Alternative (TellC s m)
MonadPlus
, Monad (TellC s m)
Monad (TellC s m)
-> (forall a. (a -> TellC s m a) -> TellC s m a)
-> MonadFix (TellC s m)
(a -> TellC s m a) -> TellC s m a
forall a. (a -> TellC s m a) -> TellC s m a
forall s (m :: * -> *). MonadFix m => Monad (TellC s m)
forall s (m :: * -> *) a.
MonadFix m =>
(a -> TellC s m a) -> TellC s m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: (a -> TellC s m a) -> TellC s m a
$cmfix :: forall s (m :: * -> *) a.
MonadFix m =>
(a -> TellC s m a) -> TellC s m a
$cp1MonadFix :: forall s (m :: * -> *). MonadFix m => Monad (TellC s m)
MonadFix, Monad (TellC s m)
Monad (TellC s m)
-> (forall a. String -> TellC s m a) -> MonadFail (TellC s m)
String -> TellC s m a
forall a. String -> TellC s m a
forall s (m :: * -> *). MonadFail m => Monad (TellC s m)
forall s (m :: * -> *) a. MonadFail m => String -> TellC s m a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> TellC s m a
$cfail :: forall s (m :: * -> *) a. MonadFail m => String -> TellC s m a
$cp1MonadFail :: forall s (m :: * -> *). MonadFail m => Monad (TellC s m)
MonadFail, Monad (TellC s m)
Monad (TellC s m)
-> (forall a. IO a -> TellC s m a) -> MonadIO (TellC s m)
IO a -> TellC s m a
forall a. IO a -> TellC s m a
forall s (m :: * -> *). MonadIO m => Monad (TellC s m)
forall s (m :: * -> *) a. MonadIO m => IO a -> TellC s m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> TellC s m a
$cliftIO :: forall s (m :: * -> *) a. MonadIO m => IO a -> TellC s m a
$cp1MonadIO :: forall s (m :: * -> *). MonadIO m => Monad (TellC s m)
MonadIO
)
via WriterT s m
deriving m a -> TellC s m a
(forall (m :: * -> *) a. Monad m => m a -> TellC s m a)
-> MonadTrans (TellC s)
forall s (m :: * -> *) a. Monad m => m a -> TellC s m a
forall (m :: * -> *) a. Monad m => m a -> TellC s m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> TellC s m a
$clift :: forall s (m :: * -> *) a. Monad m => m a -> TellC s m a
MonadTrans via (WriterT s)
instance MonadThrow m => MonadThrow (TellC s m) where
throwM :: e -> TellC s m a
throwM = m a -> TellC s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> TellC s m a) -> (e -> m a) -> e -> TellC s m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> m a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
C.throwM
{-# INLINEABLE throwM #-}
instance (Monoid s, MonadCatch m) => MonadCatch (TellC s m) where
catch :: TellC s m a -> (e -> TellC s m a) -> TellC s m a
catch (TellC WriterT s m a
m) e -> TellC s m a
h = WriterT s m a -> TellC s m a
forall s (m :: * -> *) a. WriterT s m a -> TellC s m a
TellC (WriterT s m a -> TellC s m a) -> WriterT s m a -> TellC s m a
forall a b. (a -> b) -> a -> b
$ m (a, s) -> WriterT s m a
forall (m :: * -> *) w a.
(Functor m, Monoid w) =>
m (a, w) -> WriterT w m a
writerT (m (a, s) -> WriterT s m a) -> m (a, s) -> WriterT s m a
forall a b. (a -> b) -> a -> b
$
WriterT s m a -> m (a, s)
forall w (m :: * -> *) a. Monoid w => WriterT w m a -> m (a, w)
runWriterT WriterT s m a
m m (a, s) -> (e -> m (a, s)) -> m (a, s)
forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
m a -> (e -> m a) -> m a
`C.catch` (WriterT s m a -> m (a, s)
forall w (m :: * -> *) a. Monoid w => WriterT w m a -> m (a, w)
runWriterT (WriterT s m a -> m (a, s))
-> (e -> WriterT s m a) -> e -> m (a, s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TellC s m a -> WriterT s m a
forall s (m :: * -> *) a. TellC s m a -> WriterT s m a
unTellC (TellC s m a -> WriterT s m a)
-> (e -> TellC s m a) -> e -> WriterT s m a
forall c b a. Coercible c b => (b -> c) -> (a -> b) -> a -> c
#. e -> TellC s m a
h)
{-# INLINEABLE catch #-}
instance (Monoid s, MonadMask m) => MonadMask (TellC s m) where
mask :: ((forall a. TellC s m a -> TellC s m a) -> TellC s m b)
-> TellC s m b
mask (forall a. TellC s m a -> TellC s m a) -> TellC s m b
main = WriterT s m b -> TellC s m b
forall s (m :: * -> *) a. WriterT s m a -> TellC s m a
TellC (WriterT s m b -> TellC s m b) -> WriterT s m b -> TellC s m b
forall a b. (a -> b) -> a -> b
$ m (b, s) -> WriterT s m b
forall (m :: * -> *) w a.
(Functor m, Monoid w) =>
m (a, w) -> WriterT w m a
writerT (m (b, s) -> WriterT s m b) -> m (b, s) -> WriterT s m b
forall a b. (a -> b) -> a -> b
$ ((forall a. m a -> m a) -> m (b, s)) -> m (b, s)
forall (m :: * -> *) b.
MonadMask m =>
((forall a. m a -> m a) -> m b) -> m b
C.mask (((forall a. m a -> m a) -> m (b, s)) -> m (b, s))
-> ((forall a. m a -> m a) -> m (b, s)) -> m (b, s)
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> m a
restore ->
WriterT s m b -> m (b, s)
forall w (m :: * -> *) a. Monoid w => WriterT w m a -> m (a, w)
runWriterT (TellC s m b -> WriterT s m b
forall s (m :: * -> *) a. TellC s m a -> WriterT s m a
unTellC ((forall a. TellC s m a -> TellC s m a) -> TellC s m b
main (WriterT s m a -> TellC s m a
forall s (m :: * -> *) a. WriterT s m a -> TellC s m a
TellC (WriterT s m a -> TellC s m a)
-> (WriterT s m a -> WriterT s m a) -> WriterT s m a -> TellC s m a
forall c b a. Coercible c b => (b -> c) -> (a -> b) -> a -> c
#. (m (a, s) -> m (a, s)) -> WriterT s m a -> WriterT s m a
forall (n :: * -> *) w w' (m :: * -> *) a b.
(Monad n, Monoid w, Monoid w') =>
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
W.mapWriterT m (a, s) -> m (a, s)
forall a. m a -> m a
restore (WriterT s m a -> TellC s m a)
-> (TellC s m a -> WriterT s m a) -> TellC s m a -> TellC s m a
forall b a c. Coercible b a => (b -> c) -> (a -> b) -> a -> c
.# TellC s m a -> WriterT s m a
forall s (m :: * -> *) a. TellC s m a -> WriterT s m a
unTellC)))
{-# INLINEABLE mask #-}
uninterruptibleMask :: ((forall a. TellC s m a -> TellC s m a) -> TellC s m b)
-> TellC s m b
uninterruptibleMask (forall a. TellC s m a -> TellC s m a) -> TellC s m b
main = WriterT s m b -> TellC s m b
forall s (m :: * -> *) a. WriterT s m a -> TellC s m a
TellC (WriterT s m b -> TellC s m b) -> WriterT s m b -> TellC s m b
forall a b. (a -> b) -> a -> b
$ m (b, s) -> WriterT s m b
forall (m :: * -> *) w a.
(Functor m, Monoid w) =>
m (a, w) -> WriterT w m a
writerT (m (b, s) -> WriterT s m b) -> m (b, s) -> WriterT s m b
forall a b. (a -> b) -> a -> b
$ ((forall a. m a -> m a) -> m (b, s)) -> m (b, s)
forall (m :: * -> *) b.
MonadMask m =>
((forall a. m a -> m a) -> m b) -> m b
C.uninterruptibleMask (((forall a. m a -> m a) -> m (b, s)) -> m (b, s))
-> ((forall a. m a -> m a) -> m (b, s)) -> m (b, s)
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> m a
restore ->
WriterT s m b -> m (b, s)
forall w (m :: * -> *) a. Monoid w => WriterT w m a -> m (a, w)
runWriterT (TellC s m b -> WriterT s m b
forall s (m :: * -> *) a. TellC s m a -> WriterT s m a
unTellC ((forall a. TellC s m a -> TellC s m a) -> TellC s m b
main (WriterT s m a -> TellC s m a
forall s (m :: * -> *) a. WriterT s m a -> TellC s m a
TellC (WriterT s m a -> TellC s m a)
-> (WriterT s m a -> WriterT s m a) -> WriterT s m a -> TellC s m a
forall c b a. Coercible c b => (b -> c) -> (a -> b) -> a -> c
#. (m (a, s) -> m (a, s)) -> WriterT s m a -> WriterT s m a
forall (n :: * -> *) w w' (m :: * -> *) a b.
(Monad n, Monoid w, Monoid w') =>
(m (a, w) -> n (b, w')) -> WriterT w m a -> WriterT w' n b
W.mapWriterT m (a, s) -> m (a, s)
forall a. m a -> m a
restore (WriterT s m a -> TellC s m a)
-> (TellC s m a -> WriterT s m a) -> TellC s m a -> TellC s m a
forall b a c. Coercible b a => (b -> c) -> (a -> b) -> a -> c
.# TellC s m a -> WriterT s m a
forall s (m :: * -> *) a. TellC s m a -> WriterT s m a
unTellC)))
{-# INLINEABLE uninterruptibleMask #-}
generalBracket :: TellC s m a
-> (a -> ExitCase b -> TellC s m c)
-> (a -> TellC s m b)
-> TellC s m (b, c)
generalBracket TellC s m a
acquire a -> ExitCase b -> TellC s m c
release a -> TellC s m b
use =
(Bracket (WriterT s m) (b, c) -> WriterT s m (b, c))
-> Bracket (TellC s m) (b, c) -> TellC s m (b, c)
forall (n :: * -> *) (m :: * -> *) (e :: (* -> *) -> * -> *) a b.
(Coercible n m, RepresentationalEff e) =>
(e m a -> m b) -> e n a -> n b
coerceAlg
((forall x. Bracket m x -> m x)
-> Bracket (WriterT s m) (b, c) -> WriterT s m (b, c)
forall (t :: (* -> *) -> * -> *) (e :: (* -> *) -> * -> *)
(m :: * -> *) a.
(ThreadsEff t e, Monad m) =>
(forall x. e m x -> m x) -> e (t m) a -> t m a
threadEff @(WriterT s) @_ @m
(\(GeneralBracket a r u) -> m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c)
forall (m :: * -> *) a b c.
MonadMask m =>
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c)
C.generalBracket m a
a a -> ExitCase b -> m c
r a -> m b
u)
)
(TellC s m a
-> (a -> ExitCase b -> TellC s m c)
-> (a -> TellC s m b)
-> Bracket (TellC s m) (b, c)
forall (m :: * -> *) a b c.
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> Bracket m (b, c)
GeneralBracket TellC s m a
acquire a -> ExitCase b -> TellC s m c
release a -> TellC s m b
use)
{-# INLINEABLE generalBracket #-}
instance MonadBase b m => MonadBase b (TellC s m) where
liftBase :: b α -> TellC s m α
liftBase = m α -> TellC s m α
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m α -> TellC s m α) -> (b α -> m α) -> b α -> TellC s m α
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b α -> m α
forall (b :: * -> *) (m :: * -> *) α. MonadBase b m => b α -> m α
liftBase
{-# INLINEABLE liftBase #-}
instance ( MonadBaseControl b m
, Monoid s
)
=> MonadBaseControl b (TellC s m) where
type StM (TellC s m) a = StM m (a, s)
liftBaseWith :: (RunInBase (TellC s m) b -> b a) -> TellC s m a
liftBaseWith = (RunInBase (TellC s m) b -> b a) -> TellC s m a
forall (t :: (* -> *) -> * -> *) (b :: * -> *) (m :: * -> *) a.
(MonadTransControl t, MonadBaseControl b m) =>
(RunInBaseDefault t m b -> b a) -> t m a
defaultLiftBaseWith
{-# INLINEABLE liftBaseWith #-}
restoreM :: StM (TellC s m) a -> TellC s m a
restoreM = StM (TellC s m) a -> TellC s m a
forall (t :: (* -> *) -> * -> *) (b :: * -> *) (m :: * -> *) a.
(MonadTransControl t, MonadBaseControl b m) =>
ComposeSt t m a -> t m a
defaultRestoreM
{-# INLINEABLE restoreM #-}
instance Monoid s => MonadTransControl (TellC s) where
type StT (TellC s) a = (a, s)
liftWith :: (Run (TellC s) -> m a) -> TellC s m a
liftWith Run (TellC s) -> m a
main = m a -> TellC s m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (Run (TellC s) -> m a
main (WriterT s n b -> n (b, s)
forall w (m :: * -> *) a. Monoid w => WriterT w m a -> m (a, w)
runWriterT (WriterT s n b -> n (b, s))
-> (TellC s n b -> WriterT s n b) -> TellC s n b -> n (b, s)
forall b a c. Coercible b a => (b -> c) -> (a -> b) -> a -> c
.# TellC s n b -> WriterT s n b
forall s (m :: * -> *) a. TellC s m a -> WriterT s m a
unTellC))
{-# INLINEABLE liftWith #-}
restoreT :: m (StT (TellC s) a) -> TellC s m a
restoreT = WriterT s m a -> TellC s m a
forall s (m :: * -> *) a. WriterT s m a -> TellC s m a
TellC (WriterT s m a -> TellC s m a)
-> (m (a, s) -> WriterT s m a) -> m (a, s) -> TellC s m a
forall c b a. Coercible c b => (b -> c) -> (a -> b) -> a -> c
#. m (a, s) -> WriterT s m a
forall (m :: * -> *) w a.
(Functor m, Monoid w) =>
m (a, w) -> WriterT w m a
writerT
{-# INLINEABLE restoreT #-}
instance ( Carrier m
, Monoid s
, Threads (WriterT s) (Prims m)
)
=> Carrier (TellC s m) where
type Derivs (TellC s m) = Tell s ': Derivs m
type Prims (TellC s m) = Prims m
algPrims :: Algebra' (Prims (TellC s m)) (TellC s m) a
algPrims = (Union (Prims m) (WriterT s m) a -> WriterT s m a)
-> Union (Prims m) (TellC s m) a -> TellC s m a
forall (n :: * -> *) (m :: * -> *) (e :: (* -> *) -> * -> *) a b.
(Coercible n m, RepresentationalEff e) =>
(e m a -> m b) -> e n a -> n b
coerceAlg (Algebra (Prims m) m -> Algebra (Prims m) (WriterT s m)
forall (t :: (* -> *) -> * -> *) (p :: [(* -> *) -> * -> *])
(m :: * -> *).
(Threads t p, Monad m) =>
Algebra p m -> Algebra p (t m)
thread @(WriterT s) (Carrier m => Algebra (Prims m) m
forall (m :: * -> *) a. Carrier m => Algebra' (Prims m) m a
algPrims @m))
{-# INLINEABLE algPrims #-}
reformulate :: Reformulation'
(Derivs (TellC s m)) (Prims (TellC s m)) (TellC s m) z a
reformulate forall x. TellC s m x -> z x
n Algebra (Prims (TellC s m)) z
alg = Algebra' (Derivs m) z a
-> (Tell s z a -> z a) -> Algebra' (Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (Reformulation' (Derivs m) (Prims m) m z a
forall (m :: * -> *) (z :: * -> *) a.
(Carrier m, Monad z) =>
Reformulation' (Derivs m) (Prims m) m z a
reformulate (TellC s m x -> z x
forall x. TellC s m x -> z x
n (TellC s m x -> z x) -> (m x -> TellC s m x) -> m x -> z x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m x -> TellC s m x
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift) forall x. Union (Prims m) z x -> z x
Algebra (Prims (TellC s m)) z
alg) ((Tell s z a -> z a) -> Algebra' (Tell s : Derivs m) z a)
-> (Tell s z a -> z a) -> Algebra' (Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Tell s
s -> TellC s m () -> z ()
forall x. TellC s m x -> z x
n (WriterT s m () -> TellC s m ()
forall s (m :: * -> *) a. WriterT s m a -> TellC s m a
TellC (s -> WriterT s m ()
forall w (m :: * -> *). (Monoid w, Monad m) => w -> WriterT w m ()
W.tell s
s))
{-# INLINEABLE reformulate #-}
newtype ListenC s m a = ListenC {
ListenC s m a -> WriterT s m a
unListenC :: WriterT s m a
}
deriving ( a -> ListenC s m b -> ListenC s m a
(a -> b) -> ListenC s m a -> ListenC s m b
(forall a b. (a -> b) -> ListenC s m a -> ListenC s m b)
-> (forall a b. a -> ListenC s m b -> ListenC s m a)
-> Functor (ListenC s m)
forall a b. a -> ListenC s m b -> ListenC s m a
forall a b. (a -> b) -> ListenC s m a -> ListenC s m b
forall s (m :: * -> *) a b.
Functor m =>
a -> ListenC s m b -> ListenC s m a
forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> ListenC s m a -> ListenC s m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> ListenC s m b -> ListenC s m a
$c<$ :: forall s (m :: * -> *) a b.
Functor m =>
a -> ListenC s m b -> ListenC s m a
fmap :: (a -> b) -> ListenC s m a -> ListenC s m b
$cfmap :: forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> ListenC s m a -> ListenC s m b
Functor, Functor (ListenC s m)
a -> ListenC s m a
Functor (ListenC s m)
-> (forall a. a -> ListenC s m a)
-> (forall a b.
ListenC s m (a -> b) -> ListenC s m a -> ListenC s m b)
-> (forall a b c.
(a -> b -> c) -> ListenC s m a -> ListenC s m b -> ListenC s m c)
-> (forall a b. ListenC s m a -> ListenC s m b -> ListenC s m b)
-> (forall a b. ListenC s m a -> ListenC s m b -> ListenC s m a)
-> Applicative (ListenC s m)
ListenC s m a -> ListenC s m b -> ListenC s m b
ListenC s m a -> ListenC s m b -> ListenC s m a
ListenC s m (a -> b) -> ListenC s m a -> ListenC s m b
(a -> b -> c) -> ListenC s m a -> ListenC s m b -> ListenC s m c
forall a. a -> ListenC s m a
forall a b. ListenC s m a -> ListenC s m b -> ListenC s m a
forall a b. ListenC s m a -> ListenC s m b -> ListenC s m b
forall a b. ListenC s m (a -> b) -> ListenC s m a -> ListenC s m b
forall a b c.
(a -> b -> c) -> ListenC s m a -> ListenC s m b -> ListenC s m c
forall s (m :: * -> *). Monad m => Functor (ListenC s m)
forall s (m :: * -> *) a. Monad m => a -> ListenC s m a
forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> ListenC s m b -> ListenC s m a
forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> ListenC s m b -> ListenC s m b
forall s (m :: * -> *) a b.
Monad m =>
ListenC s m (a -> b) -> ListenC s m a -> ListenC s m b
forall s (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> ListenC s m a -> ListenC s m b -> ListenC s m 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
<* :: ListenC s m a -> ListenC s m b -> ListenC s m a
$c<* :: forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> ListenC s m b -> ListenC s m a
*> :: ListenC s m a -> ListenC s m b -> ListenC s m b
$c*> :: forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> ListenC s m b -> ListenC s m b
liftA2 :: (a -> b -> c) -> ListenC s m a -> ListenC s m b -> ListenC s m c
$cliftA2 :: forall s (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> ListenC s m a -> ListenC s m b -> ListenC s m c
<*> :: ListenC s m (a -> b) -> ListenC s m a -> ListenC s m b
$c<*> :: forall s (m :: * -> *) a b.
Monad m =>
ListenC s m (a -> b) -> ListenC s m a -> ListenC s m b
pure :: a -> ListenC s m a
$cpure :: forall s (m :: * -> *) a. Monad m => a -> ListenC s m a
$cp1Applicative :: forall s (m :: * -> *). Monad m => Functor (ListenC s m)
Applicative, Applicative (ListenC s m)
a -> ListenC s m a
Applicative (ListenC s m)
-> (forall a b.
ListenC s m a -> (a -> ListenC s m b) -> ListenC s m b)
-> (forall a b. ListenC s m a -> ListenC s m b -> ListenC s m b)
-> (forall a. a -> ListenC s m a)
-> Monad (ListenC s m)
ListenC s m a -> (a -> ListenC s m b) -> ListenC s m b
ListenC s m a -> ListenC s m b -> ListenC s m b
forall a. a -> ListenC s m a
forall a b. ListenC s m a -> ListenC s m b -> ListenC s m b
forall a b. ListenC s m a -> (a -> ListenC s m b) -> ListenC s m b
forall s (m :: * -> *). Monad m => Applicative (ListenC s m)
forall s (m :: * -> *) a. Monad m => a -> ListenC s m a
forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> ListenC s m b -> ListenC s m b
forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> (a -> ListenC s m b) -> ListenC s 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 :: a -> ListenC s m a
$creturn :: forall s (m :: * -> *) a. Monad m => a -> ListenC s m a
>> :: ListenC s m a -> ListenC s m b -> ListenC s m b
$c>> :: forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> ListenC s m b -> ListenC s m b
>>= :: ListenC s m a -> (a -> ListenC s m b) -> ListenC s m b
$c>>= :: forall s (m :: * -> *) a b.
Monad m =>
ListenC s m a -> (a -> ListenC s m b) -> ListenC s m b
$cp1Monad :: forall s (m :: * -> *). Monad m => Applicative (ListenC s m)
Monad
, Applicative (ListenC s m)
ListenC s m a
Applicative (ListenC s m)
-> (forall a. ListenC s m a)
-> (forall a. ListenC s m a -> ListenC s m a -> ListenC s m a)
-> (forall a. ListenC s m a -> ListenC s m [a])
-> (forall a. ListenC s m a -> ListenC s m [a])
-> Alternative (ListenC s m)
ListenC s m a -> ListenC s m a -> ListenC s m a
ListenC s m a -> ListenC s m [a]
ListenC s m a -> ListenC s m [a]
forall a. ListenC s m a
forall a. ListenC s m a -> ListenC s m [a]
forall a. ListenC s m a -> ListenC s m a -> ListenC s m a
forall s (m :: * -> *). MonadPlus m => Applicative (ListenC s m)
forall s (m :: * -> *) a. MonadPlus m => ListenC s m a
forall s (m :: * -> *) a.
MonadPlus m =>
ListenC s m a -> ListenC s m [a]
forall s (m :: * -> *) a.
MonadPlus m =>
ListenC s m a -> ListenC s m a -> ListenC s 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 :: ListenC s m a -> ListenC s m [a]
$cmany :: forall s (m :: * -> *) a.
MonadPlus m =>
ListenC s m a -> ListenC s m [a]
some :: ListenC s m a -> ListenC s m [a]
$csome :: forall s (m :: * -> *) a.
MonadPlus m =>
ListenC s m a -> ListenC s m [a]
<|> :: ListenC s m a -> ListenC s m a -> ListenC s m a
$c<|> :: forall s (m :: * -> *) a.
MonadPlus m =>
ListenC s m a -> ListenC s m a -> ListenC s m a
empty :: ListenC s m a
$cempty :: forall s (m :: * -> *) a. MonadPlus m => ListenC s m a
$cp1Alternative :: forall s (m :: * -> *). MonadPlus m => Applicative (ListenC s m)
Alternative, Monad (ListenC s m)
Alternative (ListenC s m)
ListenC s m a
Alternative (ListenC s m)
-> Monad (ListenC s m)
-> (forall a. ListenC s m a)
-> (forall a. ListenC s m a -> ListenC s m a -> ListenC s m a)
-> MonadPlus (ListenC s m)
ListenC s m a -> ListenC s m a -> ListenC s m a
forall a. ListenC s m a
forall a. ListenC s m a -> ListenC s m a -> ListenC s m a
forall s (m :: * -> *). MonadPlus m => Monad (ListenC s m)
forall s (m :: * -> *). MonadPlus m => Alternative (ListenC s m)
forall s (m :: * -> *) a. MonadPlus m => ListenC s m a
forall s (m :: * -> *) a.
MonadPlus m =>
ListenC s m a -> ListenC s m a -> ListenC s m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: ListenC s m a -> ListenC s m a -> ListenC s m a
$cmplus :: forall s (m :: * -> *) a.
MonadPlus m =>
ListenC s m a -> ListenC s m a -> ListenC s m a
mzero :: ListenC s m a
$cmzero :: forall s (m :: * -> *) a. MonadPlus m => ListenC s m a
$cp2MonadPlus :: forall s (m :: * -> *). MonadPlus m => Monad (ListenC s m)
$cp1MonadPlus :: forall s (m :: * -> *). MonadPlus m => Alternative (ListenC s m)
MonadPlus
, Monad (ListenC s m)
Monad (ListenC s m)
-> (forall a. (a -> ListenC s m a) -> ListenC s m a)
-> MonadFix (ListenC s m)
(a -> ListenC s m a) -> ListenC s m a
forall a. (a -> ListenC s m a) -> ListenC s m a
forall s (m :: * -> *). MonadFix m => Monad (ListenC s m)
forall s (m :: * -> *) a.
MonadFix m =>
(a -> ListenC s m a) -> ListenC s m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: (a -> ListenC s m a) -> ListenC s m a
$cmfix :: forall s (m :: * -> *) a.
MonadFix m =>
(a -> ListenC s m a) -> ListenC s m a
$cp1MonadFix :: forall s (m :: * -> *). MonadFix m => Monad (ListenC s m)
MonadFix, Monad (ListenC s m)
Monad (ListenC s m)
-> (forall a. String -> ListenC s m a) -> MonadFail (ListenC s m)
String -> ListenC s m a
forall a. String -> ListenC s m a
forall s (m :: * -> *). MonadFail m => Monad (ListenC s m)
forall s (m :: * -> *) a. MonadFail m => String -> ListenC s m a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> ListenC s m a
$cfail :: forall s (m :: * -> *) a. MonadFail m => String -> ListenC s m a
$cp1MonadFail :: forall s (m :: * -> *). MonadFail m => Monad (ListenC s m)
MonadFail, Monad (ListenC s m)
Monad (ListenC s m)
-> (forall a. IO a -> ListenC s m a) -> MonadIO (ListenC s m)
IO a -> ListenC s m a
forall a. IO a -> ListenC s m a
forall s (m :: * -> *). MonadIO m => Monad (ListenC s m)
forall s (m :: * -> *) a. MonadIO m => IO a -> ListenC s m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> ListenC s m a
$cliftIO :: forall s (m :: * -> *) a. MonadIO m => IO a -> ListenC s m a
$cp1MonadIO :: forall s (m :: * -> *). MonadIO m => Monad (ListenC s m)
MonadIO
, Monad (ListenC s m)
e -> ListenC s m a
Monad (ListenC s m)
-> (forall e a. Exception e => e -> ListenC s m a)
-> MonadThrow (ListenC s m)
forall e a. Exception e => e -> ListenC s m a
forall s (m :: * -> *). MonadThrow m => Monad (ListenC s m)
forall s (m :: * -> *) e a.
(MonadThrow m, Exception e) =>
e -> ListenC s m a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> ListenC s m a
$cthrowM :: forall s (m :: * -> *) e a.
(MonadThrow m, Exception e) =>
e -> ListenC s m a
$cp1MonadThrow :: forall s (m :: * -> *). MonadThrow m => Monad (ListenC s m)
MonadThrow, MonadThrow (ListenC s m)
MonadThrow (ListenC s m)
-> (forall e a.
Exception e =>
ListenC s m a -> (e -> ListenC s m a) -> ListenC s m a)
-> MonadCatch (ListenC s m)
ListenC s m a -> (e -> ListenC s m a) -> ListenC s m a
forall e a.
Exception e =>
ListenC s m a -> (e -> ListenC s m a) -> ListenC s m a
forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (ListenC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
ListenC s m a -> (e -> ListenC s m a) -> ListenC s m a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: ListenC s m a -> (e -> ListenC s m a) -> ListenC s m a
$ccatch :: forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
ListenC s m a -> (e -> ListenC s m a) -> ListenC s m a
$cp1MonadCatch :: forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (ListenC s m)
MonadCatch, MonadCatch (ListenC s m)
MonadCatch (ListenC s m)
-> (forall b.
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b)
-> (forall b.
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b)
-> (forall a b c.
ListenC s m a
-> (a -> ExitCase b -> ListenC s m c)
-> (a -> ListenC s m b)
-> ListenC s m (b, c))
-> MonadMask (ListenC s m)
ListenC s m a
-> (a -> ExitCase b -> ListenC s m c)
-> (a -> ListenC s m b)
-> ListenC s m (b, c)
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
forall b.
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
forall a b c.
ListenC s m a
-> (a -> ExitCase b -> ListenC s m c)
-> (a -> ListenC s m b)
-> ListenC s m (b, c)
forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (ListenC s m)
forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
ListenC s m a
-> (a -> ExitCase b -> ListenC s m c)
-> (a -> ListenC s m b)
-> ListenC s m (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: ListenC s m a
-> (a -> ExitCase b -> ListenC s m c)
-> (a -> ListenC s m b)
-> ListenC s m (b, c)
$cgeneralBracket :: forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
ListenC s m a
-> (a -> ExitCase b -> ListenC s m c)
-> (a -> ListenC s m b)
-> ListenC s m (b, c)
uninterruptibleMask :: ((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
$cuninterruptibleMask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
mask :: ((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
$cmask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. ListenC s m a -> ListenC s m a) -> ListenC s m b)
-> ListenC s m b
$cp1MonadMask :: forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (ListenC s m)
MonadMask
, MonadBase b, MonadBaseControl b
)
via TellC s m
deriving (m a -> ListenC s m a
(forall (m :: * -> *) a. Monad m => m a -> ListenC s m a)
-> MonadTrans (ListenC s)
forall s (m :: * -> *) a. Monad m => m a -> ListenC s m a
forall (m :: * -> *) a. Monad m => m a -> ListenC s m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> ListenC s m a
$clift :: forall s (m :: * -> *) a. Monad m => m a -> ListenC s m a
MonadTrans, MonadTrans (ListenC s)
m (StT (ListenC s) a) -> ListenC s m a
MonadTrans (ListenC s)
-> (forall (m :: * -> *) a.
Monad m =>
(Run (ListenC s) -> m a) -> ListenC s m a)
-> (forall (m :: * -> *) a.
Monad m =>
m (StT (ListenC s) a) -> ListenC s m a)
-> MonadTransControl (ListenC s)
(Run (ListenC s) -> m a) -> ListenC s m a
forall s. Monoid s => MonadTrans (ListenC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (ListenC s) a) -> ListenC s m a
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (ListenC s) -> m a) -> ListenC s m a
forall (m :: * -> *) a.
Monad m =>
m (StT (ListenC s) a) -> ListenC s m a
forall (m :: * -> *) a.
Monad m =>
(Run (ListenC s) -> m a) -> ListenC s m a
forall (t :: (* -> *) -> * -> *).
MonadTrans t
-> (forall (m :: * -> *) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: * -> *) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
restoreT :: m (StT (ListenC s) a) -> ListenC s m a
$crestoreT :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (ListenC s) a) -> ListenC s m a
liftWith :: (Run (ListenC s) -> m a) -> ListenC s m a
$cliftWith :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (ListenC s) -> m a) -> ListenC s m a
$cp1MonadTransControl :: forall s. Monoid s => MonadTrans (ListenC s)
MonadTransControl) via (TellC s)
instance ( Carrier m
, Monoid s
, Threads (WriterT s) (Prims m)
)
=> Carrier (ListenC s m) where
type Derivs (ListenC s m) = Listen s ': Tell s ': Derivs m
type Prims (ListenC s m) = ListenPrim s ': Prims m
algPrims :: Algebra' (Prims (ListenC s m)) (ListenC s m) a
algPrims =
Algebra' (Prims m) (ListenC s m) a
-> (ListenPrim s (ListenC s m) a -> ListenC s m a)
-> Algebra' (ListenPrim s : Prims m) (ListenC s m) a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Algebra' (Prims m) (TellC s m) a
-> Algebra' (Prims m) (ListenC s m) a
coerce (forall a.
Carrier (TellC s m) =>
Algebra' (Prims (TellC s m)) (TellC s m) a
forall (m :: * -> *) a. Carrier m => Algebra' (Prims m) m a
algPrims @(TellC s m))
) ((ListenPrim s (ListenC s m) a -> ListenC s m a)
-> Algebra' (ListenPrim s : Prims m) (ListenC s m) a)
-> (ListenPrim s (ListenC s m) a -> ListenC s m a)
-> Algebra' (ListenPrim s : Prims m) (ListenC s m) a
forall a b. (a -> b) -> a -> b
$ \case
ListenPrimTell s
s -> WriterT s m () -> ListenC s m ()
forall s (m :: * -> *) a. WriterT s m a -> ListenC s m a
ListenC (WriterT s m () -> ListenC s m ())
-> WriterT s m () -> ListenC s m ()
forall a b. (a -> b) -> a -> b
$ s -> WriterT s m ()
forall w (m :: * -> *). (Monoid w, Monad m) => w -> WriterT w m ()
W.tell s
s
ListenPrimListen (ListenC m) -> WriterT s m (s, a) -> ListenC s m (s, a)
forall s (m :: * -> *) a. WriterT s m a -> ListenC s m a
ListenC (WriterT s m (s, a) -> ListenC s m (s, a))
-> WriterT s m (s, a) -> ListenC s m (s, a)
forall a b. (a -> b) -> a -> b
$ do
(a
a, s
s) <- WriterT s m a -> WriterT s m (a, s)
forall w (m :: * -> *) a.
(Monoid w, Monad m) =>
WriterT w m a -> WriterT w m (a, w)
W.listen WriterT s m a
m
(s, a) -> WriterT s m (s, a)
forall (m :: * -> *) a. Monad m => a -> m a
return (s
s, a
a)
{-# INLINEABLE algPrims #-}
reformulate :: Reformulation'
(Derivs (ListenC s m)) (Prims (ListenC s m)) (ListenC s m) z a
reformulate forall x. ListenC s m x -> z x
n Algebra (Prims (ListenC s m)) z
alg =
Algebra' (Tell s : Derivs m) z a
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Reformulation' (Tell s : Derivs m) (Prims m) (TellC s m) z a
-> Reformulation' (Tell s : Derivs m) (Prims m) (ListenC s m) z a
forall (m :: * -> *) (n :: * -> *) (r :: [(* -> *) -> * -> *])
(p :: [(* -> *) -> * -> *]) (z :: * -> *) a.
Coercible m n =>
Reformulation' r p m z a -> Reformulation' r p n z a
coerceReform (forall (z :: * -> *) a.
(Carrier (TellC s m), Monad z) =>
Reformulation'
(Derivs (TellC s m)) (Prims (TellC s m)) (TellC s m) z a
forall (m :: * -> *) (z :: * -> *) a.
(Carrier m, Monad z) =>
Reformulation' (Derivs m) (Prims m) m z a
reformulate @(TellC s m)) forall x. ListenC s m x -> z x
n (Algebra' (ListenPrim s : Prims m) z x -> Algebra' (Prims m) z x
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Algebra' (e : r) m a -> Algebra' r m a
weakenAlg Algebra' (ListenPrim s : Prims m) z x
Algebra (Prims (ListenC s m)) z
alg)
) ((Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a)
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Listen z a
m -> (Union (ListenPrim s : Prims m) z (s, a) -> z a
Algebra (Prims (ListenC s m)) z
alg (Union (ListenPrim s : Prims m) z (s, a) -> z a)
-> (ListenPrim s z (s, a)
-> Union (ListenPrim s : Prims m) z (s, a))
-> ListenPrim s z (s, a)
-> z a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ListenPrim s z (s, a) -> Union (ListenPrim s : Prims m) z (s, a)
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Member e r =>
e m a -> Union r m a
inj) (ListenPrim s z (s, a) -> z a) -> ListenPrim s z (s, a) -> z a
forall a b. (a -> b) -> a -> b
$ z a -> ListenPrim s z (s, a)
forall (m :: * -> *) a w. m a -> ListenPrim w m (w, a)
ListenPrimListen z a
m
{-# INLINEABLE reformulate #-}
newtype WriterC s m a = WriterC {
WriterC s m a -> WriterT s m a
unWriterC :: WriterT s m a
}
deriving ( a -> WriterC s m b -> WriterC s m a
(a -> b) -> WriterC s m a -> WriterC s m b
(forall a b. (a -> b) -> WriterC s m a -> WriterC s m b)
-> (forall a b. a -> WriterC s m b -> WriterC s m a)
-> Functor (WriterC s m)
forall a b. a -> WriterC s m b -> WriterC s m a
forall a b. (a -> b) -> WriterC s m a -> WriterC s m b
forall s (m :: * -> *) a b.
Functor m =>
a -> WriterC s m b -> WriterC s m a
forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> WriterC s m a -> WriterC s m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> WriterC s m b -> WriterC s m a
$c<$ :: forall s (m :: * -> *) a b.
Functor m =>
a -> WriterC s m b -> WriterC s m a
fmap :: (a -> b) -> WriterC s m a -> WriterC s m b
$cfmap :: forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> WriterC s m a -> WriterC s m b
Functor, Functor (WriterC s m)
a -> WriterC s m a
Functor (WriterC s m)
-> (forall a. a -> WriterC s m a)
-> (forall a b.
WriterC s m (a -> b) -> WriterC s m a -> WriterC s m b)
-> (forall a b c.
(a -> b -> c) -> WriterC s m a -> WriterC s m b -> WriterC s m c)
-> (forall a b. WriterC s m a -> WriterC s m b -> WriterC s m b)
-> (forall a b. WriterC s m a -> WriterC s m b -> WriterC s m a)
-> Applicative (WriterC s m)
WriterC s m a -> WriterC s m b -> WriterC s m b
WriterC s m a -> WriterC s m b -> WriterC s m a
WriterC s m (a -> b) -> WriterC s m a -> WriterC s m b
(a -> b -> c) -> WriterC s m a -> WriterC s m b -> WriterC s m c
forall a. a -> WriterC s m a
forall a b. WriterC s m a -> WriterC s m b -> WriterC s m a
forall a b. WriterC s m a -> WriterC s m b -> WriterC s m b
forall a b. WriterC s m (a -> b) -> WriterC s m a -> WriterC s m b
forall a b c.
(a -> b -> c) -> WriterC s m a -> WriterC s m b -> WriterC s m c
forall s (m :: * -> *). Monad m => Functor (WriterC s m)
forall s (m :: * -> *) a. Monad m => a -> WriterC s m a
forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> WriterC s m b -> WriterC s m a
forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> WriterC s m b -> WriterC s m b
forall s (m :: * -> *) a b.
Monad m =>
WriterC s m (a -> b) -> WriterC s m a -> WriterC s m b
forall s (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> WriterC s m a -> WriterC s m b -> WriterC s m 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
<* :: WriterC s m a -> WriterC s m b -> WriterC s m a
$c<* :: forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> WriterC s m b -> WriterC s m a
*> :: WriterC s m a -> WriterC s m b -> WriterC s m b
$c*> :: forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> WriterC s m b -> WriterC s m b
liftA2 :: (a -> b -> c) -> WriterC s m a -> WriterC s m b -> WriterC s m c
$cliftA2 :: forall s (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> WriterC s m a -> WriterC s m b -> WriterC s m c
<*> :: WriterC s m (a -> b) -> WriterC s m a -> WriterC s m b
$c<*> :: forall s (m :: * -> *) a b.
Monad m =>
WriterC s m (a -> b) -> WriterC s m a -> WriterC s m b
pure :: a -> WriterC s m a
$cpure :: forall s (m :: * -> *) a. Monad m => a -> WriterC s m a
$cp1Applicative :: forall s (m :: * -> *). Monad m => Functor (WriterC s m)
Applicative, Applicative (WriterC s m)
a -> WriterC s m a
Applicative (WriterC s m)
-> (forall a b.
WriterC s m a -> (a -> WriterC s m b) -> WriterC s m b)
-> (forall a b. WriterC s m a -> WriterC s m b -> WriterC s m b)
-> (forall a. a -> WriterC s m a)
-> Monad (WriterC s m)
WriterC s m a -> (a -> WriterC s m b) -> WriterC s m b
WriterC s m a -> WriterC s m b -> WriterC s m b
forall a. a -> WriterC s m a
forall a b. WriterC s m a -> WriterC s m b -> WriterC s m b
forall a b. WriterC s m a -> (a -> WriterC s m b) -> WriterC s m b
forall s (m :: * -> *). Monad m => Applicative (WriterC s m)
forall s (m :: * -> *) a. Monad m => a -> WriterC s m a
forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> WriterC s m b -> WriterC s m b
forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> (a -> WriterC s m b) -> WriterC s 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 :: a -> WriterC s m a
$creturn :: forall s (m :: * -> *) a. Monad m => a -> WriterC s m a
>> :: WriterC s m a -> WriterC s m b -> WriterC s m b
$c>> :: forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> WriterC s m b -> WriterC s m b
>>= :: WriterC s m a -> (a -> WriterC s m b) -> WriterC s m b
$c>>= :: forall s (m :: * -> *) a b.
Monad m =>
WriterC s m a -> (a -> WriterC s m b) -> WriterC s m b
$cp1Monad :: forall s (m :: * -> *). Monad m => Applicative (WriterC s m)
Monad
, Applicative (WriterC s m)
WriterC s m a
Applicative (WriterC s m)
-> (forall a. WriterC s m a)
-> (forall a. WriterC s m a -> WriterC s m a -> WriterC s m a)
-> (forall a. WriterC s m a -> WriterC s m [a])
-> (forall a. WriterC s m a -> WriterC s m [a])
-> Alternative (WriterC s m)
WriterC s m a -> WriterC s m a -> WriterC s m a
WriterC s m a -> WriterC s m [a]
WriterC s m a -> WriterC s m [a]
forall a. WriterC s m a
forall a. WriterC s m a -> WriterC s m [a]
forall a. WriterC s m a -> WriterC s m a -> WriterC s m a
forall s (m :: * -> *). MonadPlus m => Applicative (WriterC s m)
forall s (m :: * -> *) a. MonadPlus m => WriterC s m a
forall s (m :: * -> *) a.
MonadPlus m =>
WriterC s m a -> WriterC s m [a]
forall s (m :: * -> *) a.
MonadPlus m =>
WriterC s m a -> WriterC s m a -> WriterC s 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 :: WriterC s m a -> WriterC s m [a]
$cmany :: forall s (m :: * -> *) a.
MonadPlus m =>
WriterC s m a -> WriterC s m [a]
some :: WriterC s m a -> WriterC s m [a]
$csome :: forall s (m :: * -> *) a.
MonadPlus m =>
WriterC s m a -> WriterC s m [a]
<|> :: WriterC s m a -> WriterC s m a -> WriterC s m a
$c<|> :: forall s (m :: * -> *) a.
MonadPlus m =>
WriterC s m a -> WriterC s m a -> WriterC s m a
empty :: WriterC s m a
$cempty :: forall s (m :: * -> *) a. MonadPlus m => WriterC s m a
$cp1Alternative :: forall s (m :: * -> *). MonadPlus m => Applicative (WriterC s m)
Alternative, Monad (WriterC s m)
Alternative (WriterC s m)
WriterC s m a
Alternative (WriterC s m)
-> Monad (WriterC s m)
-> (forall a. WriterC s m a)
-> (forall a. WriterC s m a -> WriterC s m a -> WriterC s m a)
-> MonadPlus (WriterC s m)
WriterC s m a -> WriterC s m a -> WriterC s m a
forall a. WriterC s m a
forall a. WriterC s m a -> WriterC s m a -> WriterC s m a
forall s (m :: * -> *). MonadPlus m => Monad (WriterC s m)
forall s (m :: * -> *). MonadPlus m => Alternative (WriterC s m)
forall s (m :: * -> *) a. MonadPlus m => WriterC s m a
forall s (m :: * -> *) a.
MonadPlus m =>
WriterC s m a -> WriterC s m a -> WriterC s m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: WriterC s m a -> WriterC s m a -> WriterC s m a
$cmplus :: forall s (m :: * -> *) a.
MonadPlus m =>
WriterC s m a -> WriterC s m a -> WriterC s m a
mzero :: WriterC s m a
$cmzero :: forall s (m :: * -> *) a. MonadPlus m => WriterC s m a
$cp2MonadPlus :: forall s (m :: * -> *). MonadPlus m => Monad (WriterC s m)
$cp1MonadPlus :: forall s (m :: * -> *). MonadPlus m => Alternative (WriterC s m)
MonadPlus
, Monad (WriterC s m)
Monad (WriterC s m)
-> (forall a. (a -> WriterC s m a) -> WriterC s m a)
-> MonadFix (WriterC s m)
(a -> WriterC s m a) -> WriterC s m a
forall a. (a -> WriterC s m a) -> WriterC s m a
forall s (m :: * -> *). MonadFix m => Monad (WriterC s m)
forall s (m :: * -> *) a.
MonadFix m =>
(a -> WriterC s m a) -> WriterC s m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: (a -> WriterC s m a) -> WriterC s m a
$cmfix :: forall s (m :: * -> *) a.
MonadFix m =>
(a -> WriterC s m a) -> WriterC s m a
$cp1MonadFix :: forall s (m :: * -> *). MonadFix m => Monad (WriterC s m)
MonadFix, Monad (WriterC s m)
Monad (WriterC s m)
-> (forall a. String -> WriterC s m a) -> MonadFail (WriterC s m)
String -> WriterC s m a
forall a. String -> WriterC s m a
forall s (m :: * -> *). MonadFail m => Monad (WriterC s m)
forall s (m :: * -> *) a. MonadFail m => String -> WriterC s m a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> WriterC s m a
$cfail :: forall s (m :: * -> *) a. MonadFail m => String -> WriterC s m a
$cp1MonadFail :: forall s (m :: * -> *). MonadFail m => Monad (WriterC s m)
MonadFail, Monad (WriterC s m)
Monad (WriterC s m)
-> (forall a. IO a -> WriterC s m a) -> MonadIO (WriterC s m)
IO a -> WriterC s m a
forall a. IO a -> WriterC s m a
forall s (m :: * -> *). MonadIO m => Monad (WriterC s m)
forall s (m :: * -> *) a. MonadIO m => IO a -> WriterC s m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> WriterC s m a
$cliftIO :: forall s (m :: * -> *) a. MonadIO m => IO a -> WriterC s m a
$cp1MonadIO :: forall s (m :: * -> *). MonadIO m => Monad (WriterC s m)
MonadIO
, Monad (WriterC s m)
e -> WriterC s m a
Monad (WriterC s m)
-> (forall e a. Exception e => e -> WriterC s m a)
-> MonadThrow (WriterC s m)
forall e a. Exception e => e -> WriterC s m a
forall s (m :: * -> *). MonadThrow m => Monad (WriterC s m)
forall s (m :: * -> *) e a.
(MonadThrow m, Exception e) =>
e -> WriterC s m a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> WriterC s m a
$cthrowM :: forall s (m :: * -> *) e a.
(MonadThrow m, Exception e) =>
e -> WriterC s m a
$cp1MonadThrow :: forall s (m :: * -> *). MonadThrow m => Monad (WriterC s m)
MonadThrow, MonadThrow (WriterC s m)
MonadThrow (WriterC s m)
-> (forall e a.
Exception e =>
WriterC s m a -> (e -> WriterC s m a) -> WriterC s m a)
-> MonadCatch (WriterC s m)
WriterC s m a -> (e -> WriterC s m a) -> WriterC s m a
forall e a.
Exception e =>
WriterC s m a -> (e -> WriterC s m a) -> WriterC s m a
forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (WriterC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
WriterC s m a -> (e -> WriterC s m a) -> WriterC s m a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: WriterC s m a -> (e -> WriterC s m a) -> WriterC s m a
$ccatch :: forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
WriterC s m a -> (e -> WriterC s m a) -> WriterC s m a
$cp1MonadCatch :: forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (WriterC s m)
MonadCatch, MonadCatch (WriterC s m)
MonadCatch (WriterC s m)
-> (forall b.
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b)
-> (forall b.
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b)
-> (forall a b c.
WriterC s m a
-> (a -> ExitCase b -> WriterC s m c)
-> (a -> WriterC s m b)
-> WriterC s m (b, c))
-> MonadMask (WriterC s m)
WriterC s m a
-> (a -> ExitCase b -> WriterC s m c)
-> (a -> WriterC s m b)
-> WriterC s m (b, c)
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
forall b.
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
forall a b c.
WriterC s m a
-> (a -> ExitCase b -> WriterC s m c)
-> (a -> WriterC s m b)
-> WriterC s m (b, c)
forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (WriterC s m)
forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
WriterC s m a
-> (a -> ExitCase b -> WriterC s m c)
-> (a -> WriterC s m b)
-> WriterC s m (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: WriterC s m a
-> (a -> ExitCase b -> WriterC s m c)
-> (a -> WriterC s m b)
-> WriterC s m (b, c)
$cgeneralBracket :: forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
WriterC s m a
-> (a -> ExitCase b -> WriterC s m c)
-> (a -> WriterC s m b)
-> WriterC s m (b, c)
uninterruptibleMask :: ((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
$cuninterruptibleMask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
mask :: ((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
$cmask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. WriterC s m a -> WriterC s m a) -> WriterC s m b)
-> WriterC s m b
$cp1MonadMask :: forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (WriterC s m)
MonadMask
, MonadBase b, MonadBaseControl b
)
via TellC s m
deriving (m a -> WriterC s m a
(forall (m :: * -> *) a. Monad m => m a -> WriterC s m a)
-> MonadTrans (WriterC s)
forall s (m :: * -> *) a. Monad m => m a -> WriterC s m a
forall (m :: * -> *) a. Monad m => m a -> WriterC s m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> WriterC s m a
$clift :: forall s (m :: * -> *) a. Monad m => m a -> WriterC s m a
MonadTrans, MonadTrans (WriterC s)
m (StT (WriterC s) a) -> WriterC s m a
MonadTrans (WriterC s)
-> (forall (m :: * -> *) a.
Monad m =>
(Run (WriterC s) -> m a) -> WriterC s m a)
-> (forall (m :: * -> *) a.
Monad m =>
m (StT (WriterC s) a) -> WriterC s m a)
-> MonadTransControl (WriterC s)
(Run (WriterC s) -> m a) -> WriterC s m a
forall s. Monoid s => MonadTrans (WriterC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (WriterC s) a) -> WriterC s m a
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (WriterC s) -> m a) -> WriterC s m a
forall (m :: * -> *) a.
Monad m =>
m (StT (WriterC s) a) -> WriterC s m a
forall (m :: * -> *) a.
Monad m =>
(Run (WriterC s) -> m a) -> WriterC s m a
forall (t :: (* -> *) -> * -> *).
MonadTrans t
-> (forall (m :: * -> *) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: * -> *) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
restoreT :: m (StT (WriterC s) a) -> WriterC s m a
$crestoreT :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (WriterC s) a) -> WriterC s m a
liftWith :: (Run (WriterC s) -> m a) -> WriterC s m a
$cliftWith :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (WriterC s) -> m a) -> WriterC s m a
$cp1MonadTransControl :: forall s. Monoid s => MonadTrans (WriterC s)
MonadTransControl) via (TellC s)
instance ( Carrier m
, Monoid s
, Threads (WriterT s) (Prims m)
)
=> Carrier (WriterC s m) where
type Derivs (WriterC s m) = Pass s ': Listen s ': Tell s ': Derivs m
type Prims (WriterC s m) = WriterPrim s ': Prims m
algPrims :: Algebra' (Prims (WriterC s m)) (WriterC s m) a
algPrims =
Algebra' (ListenPrim s : Prims m) (WriterC s m) a
-> (WriterC s m (s -> s, a) -> WriterC s m a)
-> Algebra' (WriterPrim s : Prims m) (WriterC s m) a
forall w (p :: [(* -> *) -> * -> *]) (m :: * -> *) a.
Algebra' (ListenPrim w : p) m a
-> (m (w -> w, a) -> m a) -> Algebra' (WriterPrim w : p) m a
algListenPrimIntoWriterPrim (
Algebra' (ListenPrim s : Prims m) (ListenC s m) a
-> Algebra' (ListenPrim s : Prims m) (WriterC s m) a
coerce (forall a.
Carrier (ListenC s m) =>
Algebra' (Prims (ListenC s m)) (ListenC s m) a
forall (m :: * -> *) a. Carrier m => Algebra' (Prims m) m a
algPrims @(ListenC s m))
) ((WriterC s m (s -> s, a) -> WriterC s m a)
-> Algebra' (WriterPrim s : Prims m) (WriterC s m) a)
-> (WriterC s m (s -> s, a) -> WriterC s m a)
-> Algebra' (WriterPrim s : Prims m) (WriterC s m) a
forall a b. (a -> b) -> a -> b
$ \(WriterC WriterT s m (s -> s, a)
m) -> WriterT s m a -> WriterC s m a
forall s (m :: * -> *) a. WriterT s m a -> WriterC s m a
WriterC (WriterT s m a -> WriterC s m a) -> WriterT s m a -> WriterC s m a
forall a b. (a -> b) -> a -> b
$ WriterT s m (a, s -> s) -> WriterT s m a
forall w w' (m :: * -> *) a.
(Monoid w, Monoid w', Monad m) =>
WriterT w m (a, w -> w') -> WriterT w' m a
W.pass (WriterT s m (a, s -> s) -> WriterT s m a)
-> WriterT s m (a, s -> s) -> WriterT s m a
forall a b. (a -> b) -> a -> b
$ do
(s -> s
f, a
a) <- WriterT s m (s -> s, a)
m
(a, s -> s) -> WriterT s m (a, s -> s)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
a, s -> s
f)
{-# INLINEABLE algPrims #-}
reformulate :: Reformulation'
(Derivs (WriterC s m)) (Prims (WriterC s m)) (WriterC s m) z a
reformulate forall x. WriterC s m x -> z x
n Algebra (Prims (WriterC s m)) z
alg =
Algebra' (Listen s : Tell s : Derivs m) z a
-> (Pass s z a -> z a)
-> Algebra' (Pass s : Listen s : Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Algebra' (Tell s : Derivs m) z a
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Reformulation' (Tell s : Derivs m) (Prims m) (TellC s m) z a
-> Reformulation' (Tell s : Derivs m) (Prims m) (WriterC s m) z a
forall (m :: * -> *) (n :: * -> *) (r :: [(* -> *) -> * -> *])
(p :: [(* -> *) -> * -> *]) (z :: * -> *) a.
Coercible m n =>
Reformulation' r p m z a -> Reformulation' r p n z a
coerceReform (forall (z :: * -> *) a.
(Carrier (TellC s m), Monad z) =>
Reformulation'
(Derivs (TellC s m)) (Prims (TellC s m)) (TellC s m) z a
forall (m :: * -> *) (z :: * -> *) a.
(Carrier m, Monad z) =>
Reformulation' (Derivs m) (Prims m) m z a
reformulate @(TellC s m)) forall x. WriterC s m x -> z x
n (Algebra' (WriterPrim s : Prims m) z x -> Algebra' (Prims m) z x
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Algebra' (e : r) m a -> Algebra' r m a
weakenAlg Algebra' (WriterPrim s : Prims m) z x
Algebra (Prims (WriterC s m)) z
alg)
) ((Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a)
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Listen z a
m -> (Union (WriterPrim s : Prims m) z (s, a) -> z a
Algebra (Prims (WriterC s m)) z
alg (Union (WriterPrim s : Prims m) z (s, a) -> z a)
-> (WriterPrim s z (s, a)
-> Union (WriterPrim s : Prims m) z (s, a))
-> WriterPrim s z (s, a)
-> z a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterPrim s z (s, a) -> Union (WriterPrim s : Prims m) z (s, a)
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Member e r =>
e m a -> Union r m a
inj) (WriterPrim s z (s, a) -> z a) -> WriterPrim s z (s, a) -> z a
forall a b. (a -> b) -> a -> b
$ z a -> WriterPrim s z (s, a)
forall (m :: * -> *) a w. m a -> WriterPrim w m (w, a)
WriterPrimListen z a
m
) ((Pass s z a -> z a)
-> Algebra' (Pass s : Listen s : Tell s : Derivs m) z a)
-> (Pass s z a -> z a)
-> Algebra' (Pass s : Listen s : Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Pass z (s -> s, a)
m -> (Union (WriterPrim s : Prims m) z a -> z a
Algebra (Prims (WriterC s m)) z
alg (Union (WriterPrim s : Prims m) z a -> z a)
-> (WriterPrim s z a -> Union (WriterPrim s : Prims m) z a)
-> WriterPrim s z a
-> z a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterPrim s z a -> Union (WriterPrim s : Prims m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Member e r =>
e m a -> Union r m a
inj) (WriterPrim s z a -> z a) -> WriterPrim s z a -> z a
forall a b. (a -> b) -> a -> b
$ z (s -> s, a) -> WriterPrim s z a
forall (m :: * -> *) w a. m (w -> w, a) -> WriterPrim w m a
WriterPrimPass z (s -> s, a)
m
{-# INLINEABLE reformulate #-}
newtype TellLazyC s m a = TellLazyC {
TellLazyC s m a -> WriterT s m a
unTellLazyC :: LW.WriterT s m a
}
deriving ( a -> TellLazyC s m b -> TellLazyC s m a
(a -> b) -> TellLazyC s m a -> TellLazyC s m b
(forall a b. (a -> b) -> TellLazyC s m a -> TellLazyC s m b)
-> (forall a b. a -> TellLazyC s m b -> TellLazyC s m a)
-> Functor (TellLazyC s m)
forall a b. a -> TellLazyC s m b -> TellLazyC s m a
forall a b. (a -> b) -> TellLazyC s m a -> TellLazyC s m b
forall s (m :: * -> *) a b.
Functor m =>
a -> TellLazyC s m b -> TellLazyC s m a
forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> TellLazyC s m a -> TellLazyC s m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> TellLazyC s m b -> TellLazyC s m a
$c<$ :: forall s (m :: * -> *) a b.
Functor m =>
a -> TellLazyC s m b -> TellLazyC s m a
fmap :: (a -> b) -> TellLazyC s m a -> TellLazyC s m b
$cfmap :: forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> TellLazyC s m a -> TellLazyC s m b
Functor, Functor (TellLazyC s m)
a -> TellLazyC s m a
Functor (TellLazyC s m)
-> (forall a. a -> TellLazyC s m a)
-> (forall a b.
TellLazyC s m (a -> b) -> TellLazyC s m a -> TellLazyC s m b)
-> (forall a b c.
(a -> b -> c)
-> TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m c)
-> (forall a b.
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b)
-> (forall a b.
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m a)
-> Applicative (TellLazyC s m)
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m a
TellLazyC s m (a -> b) -> TellLazyC s m a -> TellLazyC s m b
(a -> b -> c)
-> TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m c
forall a. a -> TellLazyC s m a
forall a b. TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m a
forall a b. TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
forall a b.
TellLazyC s m (a -> b) -> TellLazyC s m a -> TellLazyC s m b
forall a b c.
(a -> b -> c)
-> TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m c
forall s (m :: * -> *).
(Monoid s, Applicative m) =>
Functor (TellLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Applicative m) =>
a -> TellLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
TellLazyC s m (a -> b) -> TellLazyC s m a -> TellLazyC s m b
forall s (m :: * -> *) a b c.
(Monoid s, Applicative m) =>
(a -> b -> c)
-> TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m 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
<* :: TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m a
$c<* :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m a
*> :: TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
$c*> :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
liftA2 :: (a -> b -> c)
-> TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m c
$cliftA2 :: forall s (m :: * -> *) a b c.
(Monoid s, Applicative m) =>
(a -> b -> c)
-> TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m c
<*> :: TellLazyC s m (a -> b) -> TellLazyC s m a -> TellLazyC s m b
$c<*> :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
TellLazyC s m (a -> b) -> TellLazyC s m a -> TellLazyC s m b
pure :: a -> TellLazyC s m a
$cpure :: forall s (m :: * -> *) a.
(Monoid s, Applicative m) =>
a -> TellLazyC s m a
$cp1Applicative :: forall s (m :: * -> *).
(Monoid s, Applicative m) =>
Functor (TellLazyC s m)
Applicative, Applicative (TellLazyC s m)
a -> TellLazyC s m a
Applicative (TellLazyC s m)
-> (forall a b.
TellLazyC s m a -> (a -> TellLazyC s m b) -> TellLazyC s m b)
-> (forall a b.
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b)
-> (forall a. a -> TellLazyC s m a)
-> Monad (TellLazyC s m)
TellLazyC s m a -> (a -> TellLazyC s m b) -> TellLazyC s m b
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
forall a. a -> TellLazyC s m a
forall a b. TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
forall a b.
TellLazyC s m a -> (a -> TellLazyC s m b) -> TellLazyC s m b
forall s (m :: * -> *).
(Monoid s, Monad m) =>
Applicative (TellLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
a -> TellLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
TellLazyC s m a -> (a -> TellLazyC s m b) -> TellLazyC s 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 :: a -> TellLazyC s m a
$creturn :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
a -> TellLazyC s m a
>> :: TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
$c>> :: forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
TellLazyC s m a -> TellLazyC s m b -> TellLazyC s m b
>>= :: TellLazyC s m a -> (a -> TellLazyC s m b) -> TellLazyC s m b
$c>>= :: forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
TellLazyC s m a -> (a -> TellLazyC s m b) -> TellLazyC s m b
$cp1Monad :: forall s (m :: * -> *).
(Monoid s, Monad m) =>
Applicative (TellLazyC s m)
Monad
, Applicative (TellLazyC s m)
TellLazyC s m a
Applicative (TellLazyC s m)
-> (forall a. TellLazyC s m a)
-> (forall a.
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a)
-> (forall a. TellLazyC s m a -> TellLazyC s m [a])
-> (forall a. TellLazyC s m a -> TellLazyC s m [a])
-> Alternative (TellLazyC s m)
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
TellLazyC s m a -> TellLazyC s m [a]
TellLazyC s m a -> TellLazyC s m [a]
forall a. TellLazyC s m a
forall a. TellLazyC s m a -> TellLazyC s m [a]
forall a. TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
forall s (m :: * -> *).
(Monoid s, Alternative m) =>
Applicative (TellLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
TellLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
TellLazyC s m a -> TellLazyC s m [a]
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s 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 :: TellLazyC s m a -> TellLazyC s m [a]
$cmany :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
TellLazyC s m a -> TellLazyC s m [a]
some :: TellLazyC s m a -> TellLazyC s m [a]
$csome :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
TellLazyC s m a -> TellLazyC s m [a]
<|> :: TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
$c<|> :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
empty :: TellLazyC s m a
$cempty :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
TellLazyC s m a
$cp1Alternative :: forall s (m :: * -> *).
(Monoid s, Alternative m) =>
Applicative (TellLazyC s m)
Alternative, Monad (TellLazyC s m)
Alternative (TellLazyC s m)
TellLazyC s m a
Alternative (TellLazyC s m)
-> Monad (TellLazyC s m)
-> (forall a. TellLazyC s m a)
-> (forall a.
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a)
-> MonadPlus (TellLazyC s m)
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
forall a. TellLazyC s m a
forall a. TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Monad (TellLazyC s m)
forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Alternative (TellLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
TellLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
$cmplus :: forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
TellLazyC s m a -> TellLazyC s m a -> TellLazyC s m a
mzero :: TellLazyC s m a
$cmzero :: forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
TellLazyC s m a
$cp2MonadPlus :: forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Monad (TellLazyC s m)
$cp1MonadPlus :: forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Alternative (TellLazyC s m)
MonadPlus
, Monad (TellLazyC s m)
e -> TellLazyC s m a
Monad (TellLazyC s m)
-> (forall e a. Exception e => e -> TellLazyC s m a)
-> MonadThrow (TellLazyC s m)
forall e a. Exception e => e -> TellLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadThrow m) =>
Monad (TellLazyC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadThrow m, Exception e) =>
e -> TellLazyC s m a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> TellLazyC s m a
$cthrowM :: forall s (m :: * -> *) e a.
(Monoid s, MonadThrow m, Exception e) =>
e -> TellLazyC s m a
$cp1MonadThrow :: forall s (m :: * -> *).
(Monoid s, MonadThrow m) =>
Monad (TellLazyC s m)
MonadThrow, MonadThrow (TellLazyC s m)
MonadThrow (TellLazyC s m)
-> (forall e a.
Exception e =>
TellLazyC s m a -> (e -> TellLazyC s m a) -> TellLazyC s m a)
-> MonadCatch (TellLazyC s m)
TellLazyC s m a -> (e -> TellLazyC s m a) -> TellLazyC s m a
forall e a.
Exception e =>
TellLazyC s m a -> (e -> TellLazyC s m a) -> TellLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (TellLazyC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
TellLazyC s m a -> (e -> TellLazyC s m a) -> TellLazyC s m a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: TellLazyC s m a -> (e -> TellLazyC s m a) -> TellLazyC s m a
$ccatch :: forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
TellLazyC s m a -> (e -> TellLazyC s m a) -> TellLazyC s m a
$cp1MonadCatch :: forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (TellLazyC s m)
MonadCatch, MonadCatch (TellLazyC s m)
MonadCatch (TellLazyC s m)
-> (forall b.
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b)
-> (forall b.
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b)
-> (forall a b c.
TellLazyC s m a
-> (a -> ExitCase b -> TellLazyC s m c)
-> (a -> TellLazyC s m b)
-> TellLazyC s m (b, c))
-> MonadMask (TellLazyC s m)
TellLazyC s m a
-> (a -> ExitCase b -> TellLazyC s m c)
-> (a -> TellLazyC s m b)
-> TellLazyC s m (b, c)
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
forall b.
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
forall a b c.
TellLazyC s m a
-> (a -> ExitCase b -> TellLazyC s m c)
-> (a -> TellLazyC s m b)
-> TellLazyC s m (b, c)
forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (TellLazyC s m)
forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
TellLazyC s m a
-> (a -> ExitCase b -> TellLazyC s m c)
-> (a -> TellLazyC s m b)
-> TellLazyC s m (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: TellLazyC s m a
-> (a -> ExitCase b -> TellLazyC s m c)
-> (a -> TellLazyC s m b)
-> TellLazyC s m (b, c)
$cgeneralBracket :: forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
TellLazyC s m a
-> (a -> ExitCase b -> TellLazyC s m c)
-> (a -> TellLazyC s m b)
-> TellLazyC s m (b, c)
uninterruptibleMask :: ((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
$cuninterruptibleMask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
mask :: ((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
$cmask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. TellLazyC s m a -> TellLazyC s m a) -> TellLazyC s m b)
-> TellLazyC s m b
$cp1MonadMask :: forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (TellLazyC s m)
MonadMask
, Monad (TellLazyC s m)
Monad (TellLazyC s m)
-> (forall a. (a -> TellLazyC s m a) -> TellLazyC s m a)
-> MonadFix (TellLazyC s m)
(a -> TellLazyC s m a) -> TellLazyC s m a
forall a. (a -> TellLazyC s m a) -> TellLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadFix m) =>
Monad (TellLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadFix m) =>
(a -> TellLazyC s m a) -> TellLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: (a -> TellLazyC s m a) -> TellLazyC s m a
$cmfix :: forall s (m :: * -> *) a.
(Monoid s, MonadFix m) =>
(a -> TellLazyC s m a) -> TellLazyC s m a
$cp1MonadFix :: forall s (m :: * -> *).
(Monoid s, MonadFix m) =>
Monad (TellLazyC s m)
MonadFix, Monad (TellLazyC s m)
Monad (TellLazyC s m)
-> (forall a. String -> TellLazyC s m a)
-> MonadFail (TellLazyC s m)
String -> TellLazyC s m a
forall a. String -> TellLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadFail m) =>
Monad (TellLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadFail m) =>
String -> TellLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> TellLazyC s m a
$cfail :: forall s (m :: * -> *) a.
(Monoid s, MonadFail m) =>
String -> TellLazyC s m a
$cp1MonadFail :: forall s (m :: * -> *).
(Monoid s, MonadFail m) =>
Monad (TellLazyC s m)
MonadFail, Monad (TellLazyC s m)
Monad (TellLazyC s m)
-> (forall a. IO a -> TellLazyC s m a) -> MonadIO (TellLazyC s m)
IO a -> TellLazyC s m a
forall a. IO a -> TellLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadIO m) =>
Monad (TellLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadIO m) =>
IO a -> TellLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> TellLazyC s m a
$cliftIO :: forall s (m :: * -> *) a.
(Monoid s, MonadIO m) =>
IO a -> TellLazyC s m a
$cp1MonadIO :: forall s (m :: * -> *).
(Monoid s, MonadIO m) =>
Monad (TellLazyC s m)
MonadIO
, MonadBase b, MonadBaseControl b
)
deriving (m a -> TellLazyC s m a
(forall (m :: * -> *) a. Monad m => m a -> TellLazyC s m a)
-> MonadTrans (TellLazyC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m a -> TellLazyC s m a
forall (m :: * -> *) a. Monad m => m a -> TellLazyC s m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> TellLazyC s m a
$clift :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m a -> TellLazyC s m a
MonadTrans, MonadTrans (TellLazyC s)
m (StT (TellLazyC s) a) -> TellLazyC s m a
MonadTrans (TellLazyC s)
-> (forall (m :: * -> *) a.
Monad m =>
(Run (TellLazyC s) -> m a) -> TellLazyC s m a)
-> (forall (m :: * -> *) a.
Monad m =>
m (StT (TellLazyC s) a) -> TellLazyC s m a)
-> MonadTransControl (TellLazyC s)
(Run (TellLazyC s) -> m a) -> TellLazyC s m a
forall s. Monoid s => MonadTrans (TellLazyC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (TellLazyC s) a) -> TellLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (TellLazyC s) -> m a) -> TellLazyC s m a
forall (m :: * -> *) a.
Monad m =>
m (StT (TellLazyC s) a) -> TellLazyC s m a
forall (m :: * -> *) a.
Monad m =>
(Run (TellLazyC s) -> m a) -> TellLazyC s m a
forall (t :: (* -> *) -> * -> *).
MonadTrans t
-> (forall (m :: * -> *) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: * -> *) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
restoreT :: m (StT (TellLazyC s) a) -> TellLazyC s m a
$crestoreT :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (TellLazyC s) a) -> TellLazyC s m a
liftWith :: (Run (TellLazyC s) -> m a) -> TellLazyC s m a
$cliftWith :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (TellLazyC s) -> m a) -> TellLazyC s m a
$cp1MonadTransControl :: forall s. Monoid s => MonadTrans (TellLazyC s)
MonadTransControl)
instance ( Monoid s
, Carrier m
, Threads (LW.WriterT s) (Prims m)
)
=> Carrier (TellLazyC s m) where
type Derivs (TellLazyC s m) = Tell s ': Derivs m
type Prims (TellLazyC s m) = Prims m
algPrims :: Algebra' (Prims (TellLazyC s m)) (TellLazyC s m) a
algPrims = (Union (Prims m) (WriterT s m) a -> WriterT s m a)
-> Algebra' (Prims m) (TellLazyC s m) a
coerce (Algebra (Prims m) m -> Algebra (Prims m) (WriterT s m)
forall (t :: (* -> *) -> * -> *) (p :: [(* -> *) -> * -> *])
(m :: * -> *).
(Threads t p, Monad m) =>
Algebra p m -> Algebra p (t m)
thread @(LW.WriterT s) (Carrier m => Algebra (Prims m) m
forall (m :: * -> *) a. Carrier m => Algebra' (Prims m) m a
algPrims @m))
{-# INLINEABLE algPrims #-}
reformulate :: Reformulation'
(Derivs (TellLazyC s m))
(Prims (TellLazyC s m))
(TellLazyC s m)
z
a
reformulate forall x. TellLazyC s m x -> z x
n Algebra (Prims (TellLazyC s m)) z
alg = Algebra' (Derivs m) z a
-> (Tell s z a -> z a) -> Algebra' (Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (Reformulation' (Derivs m) (Prims m) m z a
forall (m :: * -> *) (z :: * -> *) a.
(Carrier m, Monad z) =>
Reformulation' (Derivs m) (Prims m) m z a
reformulate (TellLazyC s m x -> z x
forall x. TellLazyC s m x -> z x
n (TellLazyC s m x -> z x) -> (m x -> TellLazyC s m x) -> m x -> z x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m x -> TellLazyC s m x
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift) forall x. Union (Prims m) z x -> z x
Algebra (Prims (TellLazyC s m)) z
alg) ((Tell s z a -> z a) -> Algebra' (Tell s : Derivs m) z a)
-> (Tell s z a -> z a) -> Algebra' (Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Tell s
s -> TellLazyC s m () -> z ()
forall x. TellLazyC s m x -> z x
n (TellLazyC s m () -> z ()) -> TellLazyC s m () -> z ()
forall a b. (a -> b) -> a -> b
$ WriterT s m () -> TellLazyC s m ()
forall s (m :: * -> *) a. WriterT s m a -> TellLazyC s m a
TellLazyC (WriterT s m () -> TellLazyC s m ())
-> WriterT s m () -> TellLazyC s m ()
forall a b. (a -> b) -> a -> b
$ s -> WriterT s m ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
LW.tell s
s
{-# INLINEABLE reformulate #-}
newtype ListenLazyC s m a = ListenLazyC {
ListenLazyC s m a -> WriterT s m a
unListenLazyC :: LW.WriterT s m a
}
deriving ( a -> ListenLazyC s m b -> ListenLazyC s m a
(a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
(forall a b. (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b)
-> (forall a b. a -> ListenLazyC s m b -> ListenLazyC s m a)
-> Functor (ListenLazyC s m)
forall a b. a -> ListenLazyC s m b -> ListenLazyC s m a
forall a b. (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
forall s (m :: * -> *) a b.
Functor m =>
a -> ListenLazyC s m b -> ListenLazyC s m a
forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> ListenLazyC s m b -> ListenLazyC s m a
$c<$ :: forall s (m :: * -> *) a b.
Functor m =>
a -> ListenLazyC s m b -> ListenLazyC s m a
fmap :: (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
$cfmap :: forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
Functor, Functor (ListenLazyC s m)
a -> ListenLazyC s m a
Functor (ListenLazyC s m)
-> (forall a. a -> ListenLazyC s m a)
-> (forall a b.
ListenLazyC s m (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b)
-> (forall a b c.
(a -> b -> c)
-> ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m c)
-> (forall a b.
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b)
-> (forall a b.
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m a)
-> Applicative (ListenLazyC s m)
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m a
ListenLazyC s m (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
(a -> b -> c)
-> ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m c
forall a. a -> ListenLazyC s m a
forall a b.
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m a
forall a b.
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
forall a b.
ListenLazyC s m (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
forall a b c.
(a -> b -> c)
-> ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m c
forall s (m :: * -> *).
(Monoid s, Applicative m) =>
Functor (ListenLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Applicative m) =>
a -> ListenLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
ListenLazyC s m (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
forall s (m :: * -> *) a b c.
(Monoid s, Applicative m) =>
(a -> b -> c)
-> ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m 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
<* :: ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m a
$c<* :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m a
*> :: ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
$c*> :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
liftA2 :: (a -> b -> c)
-> ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m c
$cliftA2 :: forall s (m :: * -> *) a b c.
(Monoid s, Applicative m) =>
(a -> b -> c)
-> ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m c
<*> :: ListenLazyC s m (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
$c<*> :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
ListenLazyC s m (a -> b) -> ListenLazyC s m a -> ListenLazyC s m b
pure :: a -> ListenLazyC s m a
$cpure :: forall s (m :: * -> *) a.
(Monoid s, Applicative m) =>
a -> ListenLazyC s m a
$cp1Applicative :: forall s (m :: * -> *).
(Monoid s, Applicative m) =>
Functor (ListenLazyC s m)
Applicative, Applicative (ListenLazyC s m)
a -> ListenLazyC s m a
Applicative (ListenLazyC s m)
-> (forall a b.
ListenLazyC s m a -> (a -> ListenLazyC s m b) -> ListenLazyC s m b)
-> (forall a b.
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b)
-> (forall a. a -> ListenLazyC s m a)
-> Monad (ListenLazyC s m)
ListenLazyC s m a -> (a -> ListenLazyC s m b) -> ListenLazyC s m b
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
forall a. a -> ListenLazyC s m a
forall a b.
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
forall a b.
ListenLazyC s m a -> (a -> ListenLazyC s m b) -> ListenLazyC s m b
forall s (m :: * -> *).
(Monoid s, Monad m) =>
Applicative (ListenLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
a -> ListenLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
ListenLazyC s m a -> (a -> ListenLazyC s m b) -> ListenLazyC s 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 :: a -> ListenLazyC s m a
$creturn :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
a -> ListenLazyC s m a
>> :: ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
$c>> :: forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
ListenLazyC s m a -> ListenLazyC s m b -> ListenLazyC s m b
>>= :: ListenLazyC s m a -> (a -> ListenLazyC s m b) -> ListenLazyC s m b
$c>>= :: forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
ListenLazyC s m a -> (a -> ListenLazyC s m b) -> ListenLazyC s m b
$cp1Monad :: forall s (m :: * -> *).
(Monoid s, Monad m) =>
Applicative (ListenLazyC s m)
Monad
, Applicative (ListenLazyC s m)
ListenLazyC s m a
Applicative (ListenLazyC s m)
-> (forall a. ListenLazyC s m a)
-> (forall a.
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a)
-> (forall a. ListenLazyC s m a -> ListenLazyC s m [a])
-> (forall a. ListenLazyC s m a -> ListenLazyC s m [a])
-> Alternative (ListenLazyC s m)
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
ListenLazyC s m a -> ListenLazyC s m [a]
ListenLazyC s m a -> ListenLazyC s m [a]
forall a. ListenLazyC s m a
forall a. ListenLazyC s m a -> ListenLazyC s m [a]
forall a.
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
forall s (m :: * -> *).
(Monoid s, Alternative m) =>
Applicative (ListenLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
ListenLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
ListenLazyC s m a -> ListenLazyC s m [a]
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s 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 :: ListenLazyC s m a -> ListenLazyC s m [a]
$cmany :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
ListenLazyC s m a -> ListenLazyC s m [a]
some :: ListenLazyC s m a -> ListenLazyC s m [a]
$csome :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
ListenLazyC s m a -> ListenLazyC s m [a]
<|> :: ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
$c<|> :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
empty :: ListenLazyC s m a
$cempty :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
ListenLazyC s m a
$cp1Alternative :: forall s (m :: * -> *).
(Monoid s, Alternative m) =>
Applicative (ListenLazyC s m)
Alternative, Monad (ListenLazyC s m)
Alternative (ListenLazyC s m)
ListenLazyC s m a
Alternative (ListenLazyC s m)
-> Monad (ListenLazyC s m)
-> (forall a. ListenLazyC s m a)
-> (forall a.
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a)
-> MonadPlus (ListenLazyC s m)
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
forall a. ListenLazyC s m a
forall a.
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Monad (ListenLazyC s m)
forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Alternative (ListenLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
ListenLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
$cmplus :: forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
ListenLazyC s m a -> ListenLazyC s m a -> ListenLazyC s m a
mzero :: ListenLazyC s m a
$cmzero :: forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
ListenLazyC s m a
$cp2MonadPlus :: forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Monad (ListenLazyC s m)
$cp1MonadPlus :: forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Alternative (ListenLazyC s m)
MonadPlus
, Monad (ListenLazyC s m)
e -> ListenLazyC s m a
Monad (ListenLazyC s m)
-> (forall e a. Exception e => e -> ListenLazyC s m a)
-> MonadThrow (ListenLazyC s m)
forall e a. Exception e => e -> ListenLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadThrow m) =>
Monad (ListenLazyC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadThrow m, Exception e) =>
e -> ListenLazyC s m a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> ListenLazyC s m a
$cthrowM :: forall s (m :: * -> *) e a.
(Monoid s, MonadThrow m, Exception e) =>
e -> ListenLazyC s m a
$cp1MonadThrow :: forall s (m :: * -> *).
(Monoid s, MonadThrow m) =>
Monad (ListenLazyC s m)
MonadThrow, MonadThrow (ListenLazyC s m)
MonadThrow (ListenLazyC s m)
-> (forall e a.
Exception e =>
ListenLazyC s m a -> (e -> ListenLazyC s m a) -> ListenLazyC s m a)
-> MonadCatch (ListenLazyC s m)
ListenLazyC s m a -> (e -> ListenLazyC s m a) -> ListenLazyC s m a
forall e a.
Exception e =>
ListenLazyC s m a -> (e -> ListenLazyC s m a) -> ListenLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (ListenLazyC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
ListenLazyC s m a -> (e -> ListenLazyC s m a) -> ListenLazyC s m a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: ListenLazyC s m a -> (e -> ListenLazyC s m a) -> ListenLazyC s m a
$ccatch :: forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
ListenLazyC s m a -> (e -> ListenLazyC s m a) -> ListenLazyC s m a
$cp1MonadCatch :: forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (ListenLazyC s m)
MonadCatch, MonadCatch (ListenLazyC s m)
MonadCatch (ListenLazyC s m)
-> (forall b.
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b)
-> (forall b.
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b)
-> (forall a b c.
ListenLazyC s m a
-> (a -> ExitCase b -> ListenLazyC s m c)
-> (a -> ListenLazyC s m b)
-> ListenLazyC s m (b, c))
-> MonadMask (ListenLazyC s m)
ListenLazyC s m a
-> (a -> ExitCase b -> ListenLazyC s m c)
-> (a -> ListenLazyC s m b)
-> ListenLazyC s m (b, c)
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
forall b.
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
forall a b c.
ListenLazyC s m a
-> (a -> ExitCase b -> ListenLazyC s m c)
-> (a -> ListenLazyC s m b)
-> ListenLazyC s m (b, c)
forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (ListenLazyC s m)
forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
ListenLazyC s m a
-> (a -> ExitCase b -> ListenLazyC s m c)
-> (a -> ListenLazyC s m b)
-> ListenLazyC s m (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: ListenLazyC s m a
-> (a -> ExitCase b -> ListenLazyC s m c)
-> (a -> ListenLazyC s m b)
-> ListenLazyC s m (b, c)
$cgeneralBracket :: forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
ListenLazyC s m a
-> (a -> ExitCase b -> ListenLazyC s m c)
-> (a -> ListenLazyC s m b)
-> ListenLazyC s m (b, c)
uninterruptibleMask :: ((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
$cuninterruptibleMask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
mask :: ((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
$cmask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. ListenLazyC s m a -> ListenLazyC s m a)
-> ListenLazyC s m b)
-> ListenLazyC s m b
$cp1MonadMask :: forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (ListenLazyC s m)
MonadMask
, Monad (ListenLazyC s m)
Monad (ListenLazyC s m)
-> (forall a. (a -> ListenLazyC s m a) -> ListenLazyC s m a)
-> MonadFix (ListenLazyC s m)
(a -> ListenLazyC s m a) -> ListenLazyC s m a
forall a. (a -> ListenLazyC s m a) -> ListenLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadFix m) =>
Monad (ListenLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadFix m) =>
(a -> ListenLazyC s m a) -> ListenLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: (a -> ListenLazyC s m a) -> ListenLazyC s m a
$cmfix :: forall s (m :: * -> *) a.
(Monoid s, MonadFix m) =>
(a -> ListenLazyC s m a) -> ListenLazyC s m a
$cp1MonadFix :: forall s (m :: * -> *).
(Monoid s, MonadFix m) =>
Monad (ListenLazyC s m)
MonadFix, Monad (ListenLazyC s m)
Monad (ListenLazyC s m)
-> (forall a. String -> ListenLazyC s m a)
-> MonadFail (ListenLazyC s m)
String -> ListenLazyC s m a
forall a. String -> ListenLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadFail m) =>
Monad (ListenLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadFail m) =>
String -> ListenLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> ListenLazyC s m a
$cfail :: forall s (m :: * -> *) a.
(Monoid s, MonadFail m) =>
String -> ListenLazyC s m a
$cp1MonadFail :: forall s (m :: * -> *).
(Monoid s, MonadFail m) =>
Monad (ListenLazyC s m)
MonadFail, Monad (ListenLazyC s m)
Monad (ListenLazyC s m)
-> (forall a. IO a -> ListenLazyC s m a)
-> MonadIO (ListenLazyC s m)
IO a -> ListenLazyC s m a
forall a. IO a -> ListenLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadIO m) =>
Monad (ListenLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadIO m) =>
IO a -> ListenLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> ListenLazyC s m a
$cliftIO :: forall s (m :: * -> *) a.
(Monoid s, MonadIO m) =>
IO a -> ListenLazyC s m a
$cp1MonadIO :: forall s (m :: * -> *).
(Monoid s, MonadIO m) =>
Monad (ListenLazyC s m)
MonadIO
, MonadBase b, MonadBaseControl b
)
deriving (m a -> ListenLazyC s m a
(forall (m :: * -> *) a. Monad m => m a -> ListenLazyC s m a)
-> MonadTrans (ListenLazyC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m a -> ListenLazyC s m a
forall (m :: * -> *) a. Monad m => m a -> ListenLazyC s m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> ListenLazyC s m a
$clift :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m a -> ListenLazyC s m a
MonadTrans, MonadTrans (ListenLazyC s)
m (StT (ListenLazyC s) a) -> ListenLazyC s m a
MonadTrans (ListenLazyC s)
-> (forall (m :: * -> *) a.
Monad m =>
(Run (ListenLazyC s) -> m a) -> ListenLazyC s m a)
-> (forall (m :: * -> *) a.
Monad m =>
m (StT (ListenLazyC s) a) -> ListenLazyC s m a)
-> MonadTransControl (ListenLazyC s)
(Run (ListenLazyC s) -> m a) -> ListenLazyC s m a
forall s. Monoid s => MonadTrans (ListenLazyC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (ListenLazyC s) a) -> ListenLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (ListenLazyC s) -> m a) -> ListenLazyC s m a
forall (m :: * -> *) a.
Monad m =>
m (StT (ListenLazyC s) a) -> ListenLazyC s m a
forall (m :: * -> *) a.
Monad m =>
(Run (ListenLazyC s) -> m a) -> ListenLazyC s m a
forall (t :: (* -> *) -> * -> *).
MonadTrans t
-> (forall (m :: * -> *) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: * -> *) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
restoreT :: m (StT (ListenLazyC s) a) -> ListenLazyC s m a
$crestoreT :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (ListenLazyC s) a) -> ListenLazyC s m a
liftWith :: (Run (ListenLazyC s) -> m a) -> ListenLazyC s m a
$cliftWith :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (ListenLazyC s) -> m a) -> ListenLazyC s m a
$cp1MonadTransControl :: forall s. Monoid s => MonadTrans (ListenLazyC s)
MonadTransControl)
instance ( Monoid s
, Carrier m
, Threads (LW.WriterT s) (Prims m)
)
=> Carrier (ListenLazyC s m) where
type Derivs (ListenLazyC s m) = Listen s ': Tell s ': Derivs m
type Prims (ListenLazyC s m) = ListenPrim s ': Prims m
algPrims :: Algebra' (Prims (ListenLazyC s m)) (ListenLazyC s m) a
algPrims =
Algebra' (Prims m) (ListenLazyC s m) a
-> (ListenPrim s (ListenLazyC s m) a -> ListenLazyC s m a)
-> Algebra' (ListenPrim s : Prims m) (ListenLazyC s m) a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Algebra' (Prims m) (TellLazyC s m) a
-> Algebra' (Prims m) (ListenLazyC s m) a
coerce (forall a.
Carrier (TellLazyC s m) =>
Algebra' (Prims (TellLazyC s m)) (TellLazyC s m) a
forall (m :: * -> *) a. Carrier m => Algebra' (Prims m) m a
algPrims @(TellLazyC s m))
) ((ListenPrim s (ListenLazyC s m) a -> ListenLazyC s m a)
-> Algebra' (ListenPrim s : Prims m) (ListenLazyC s m) a)
-> (ListenPrim s (ListenLazyC s m) a -> ListenLazyC s m a)
-> Algebra' (ListenPrim s : Prims m) (ListenLazyC s m) a
forall a b. (a -> b) -> a -> b
$ \case
ListenPrimTell s
w ->
WriterT s m () -> ListenLazyC s m ()
forall s (m :: * -> *) a. WriterT s m a -> ListenLazyC s m a
ListenLazyC (WriterT s m () -> ListenLazyC s m ())
-> WriterT s m () -> ListenLazyC s m ()
forall a b. (a -> b) -> a -> b
$ s -> WriterT s m ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
LW.tell s
w
ListenPrimListen (ListenLazyC m) ->
WriterT s m (s, a) -> ListenLazyC s m (s, a)
forall s (m :: * -> *) a. WriterT s m a -> ListenLazyC s m a
ListenLazyC (WriterT s m (s, a) -> ListenLazyC s m (s, a))
-> WriterT s m (s, a) -> ListenLazyC s m (s, a)
forall a b. (a -> b) -> a -> b
$ (a, s) -> (s, a)
forall a b. (a, b) -> (b, a)
swap ((a, s) -> (s, a)) -> WriterT s m (a, s) -> WriterT s m (s, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> WriterT s m a -> WriterT s m (a, s)
forall (m :: * -> *) w a.
Monad m =>
WriterT w m a -> WriterT w m (a, w)
LW.listen WriterT s m a
m
{-# INLINEABLE algPrims #-}
reformulate :: Reformulation'
(Derivs (ListenLazyC s m))
(Prims (ListenLazyC s m))
(ListenLazyC s m)
z
a
reformulate forall x. ListenLazyC s m x -> z x
n Algebra (Prims (ListenLazyC s m)) z
alg =
Algebra' (Tell s : Derivs m) z a
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Reformulation' (Tell s : Derivs m) (Prims m) (TellLazyC s m) z a
-> Reformulation'
(Tell s : Derivs m) (Prims m) (ListenLazyC s m) z a
forall (m :: * -> *) (n :: * -> *) (r :: [(* -> *) -> * -> *])
(p :: [(* -> *) -> * -> *]) (z :: * -> *) a.
Coercible m n =>
Reformulation' r p m z a -> Reformulation' r p n z a
coerceReform (forall (z :: * -> *) a.
(Carrier (TellLazyC s m), Monad z) =>
Reformulation'
(Derivs (TellLazyC s m))
(Prims (TellLazyC s m))
(TellLazyC s m)
z
a
forall (m :: * -> *) (z :: * -> *) a.
(Carrier m, Monad z) =>
Reformulation' (Derivs m) (Prims m) m z a
reformulate @(TellLazyC s m)) forall x. ListenLazyC s m x -> z x
n (Algebra' (ListenPrim s : Prims m) z x -> Algebra' (Prims m) z x
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Algebra' (e : r) m a -> Algebra' r m a
weakenAlg Algebra' (ListenPrim s : Prims m) z x
Algebra (Prims (ListenLazyC s m)) z
alg)
) ((Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a)
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Listen z a
m -> (Union (ListenPrim s : Prims m) z (s, a) -> z a
Algebra (Prims (ListenLazyC s m)) z
alg (Union (ListenPrim s : Prims m) z (s, a) -> z a)
-> (ListenPrim s z (s, a)
-> Union (ListenPrim s : Prims m) z (s, a))
-> ListenPrim s z (s, a)
-> z a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ListenPrim s z (s, a) -> Union (ListenPrim s : Prims m) z (s, a)
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Member e r =>
e m a -> Union r m a
inj) (ListenPrim s z (s, a) -> z a) -> ListenPrim s z (s, a) -> z a
forall a b. (a -> b) -> a -> b
$ z a -> ListenPrim s z (s, a)
forall (m :: * -> *) a w. m a -> ListenPrim w m (w, a)
ListenPrimListen z a
m
{-# INLINEABLE reformulate #-}
newtype WriterLazyC s m a = WriterLazyC {
WriterLazyC s m a -> WriterT s m a
_unWriterLazyC :: LW.WriterT s m a
}
deriving ( a -> WriterLazyC s m b -> WriterLazyC s m a
(a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
(forall a b. (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b)
-> (forall a b. a -> WriterLazyC s m b -> WriterLazyC s m a)
-> Functor (WriterLazyC s m)
forall a b. a -> WriterLazyC s m b -> WriterLazyC s m a
forall a b. (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
forall s (m :: * -> *) a b.
Functor m =>
a -> WriterLazyC s m b -> WriterLazyC s m a
forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> WriterLazyC s m b -> WriterLazyC s m a
$c<$ :: forall s (m :: * -> *) a b.
Functor m =>
a -> WriterLazyC s m b -> WriterLazyC s m a
fmap :: (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
$cfmap :: forall s (m :: * -> *) a b.
Functor m =>
(a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
Functor, Functor (WriterLazyC s m)
a -> WriterLazyC s m a
Functor (WriterLazyC s m)
-> (forall a. a -> WriterLazyC s m a)
-> (forall a b.
WriterLazyC s m (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b)
-> (forall a b c.
(a -> b -> c)
-> WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m c)
-> (forall a b.
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b)
-> (forall a b.
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m a)
-> Applicative (WriterLazyC s m)
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m a
WriterLazyC s m (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
(a -> b -> c)
-> WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m c
forall a. a -> WriterLazyC s m a
forall a b.
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m a
forall a b.
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
forall a b.
WriterLazyC s m (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
forall a b c.
(a -> b -> c)
-> WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m c
forall s (m :: * -> *).
(Monoid s, Applicative m) =>
Functor (WriterLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Applicative m) =>
a -> WriterLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
WriterLazyC s m (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
forall s (m :: * -> *) a b c.
(Monoid s, Applicative m) =>
(a -> b -> c)
-> WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m 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
<* :: WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m a
$c<* :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m a
*> :: WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
$c*> :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
liftA2 :: (a -> b -> c)
-> WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m c
$cliftA2 :: forall s (m :: * -> *) a b c.
(Monoid s, Applicative m) =>
(a -> b -> c)
-> WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m c
<*> :: WriterLazyC s m (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
$c<*> :: forall s (m :: * -> *) a b.
(Monoid s, Applicative m) =>
WriterLazyC s m (a -> b) -> WriterLazyC s m a -> WriterLazyC s m b
pure :: a -> WriterLazyC s m a
$cpure :: forall s (m :: * -> *) a.
(Monoid s, Applicative m) =>
a -> WriterLazyC s m a
$cp1Applicative :: forall s (m :: * -> *).
(Monoid s, Applicative m) =>
Functor (WriterLazyC s m)
Applicative, Applicative (WriterLazyC s m)
a -> WriterLazyC s m a
Applicative (WriterLazyC s m)
-> (forall a b.
WriterLazyC s m a -> (a -> WriterLazyC s m b) -> WriterLazyC s m b)
-> (forall a b.
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b)
-> (forall a. a -> WriterLazyC s m a)
-> Monad (WriterLazyC s m)
WriterLazyC s m a -> (a -> WriterLazyC s m b) -> WriterLazyC s m b
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
forall a. a -> WriterLazyC s m a
forall a b.
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
forall a b.
WriterLazyC s m a -> (a -> WriterLazyC s m b) -> WriterLazyC s m b
forall s (m :: * -> *).
(Monoid s, Monad m) =>
Applicative (WriterLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
a -> WriterLazyC s m a
forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
WriterLazyC s m a -> (a -> WriterLazyC s m b) -> WriterLazyC s 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 :: a -> WriterLazyC s m a
$creturn :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
a -> WriterLazyC s m a
>> :: WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
$c>> :: forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
WriterLazyC s m a -> WriterLazyC s m b -> WriterLazyC s m b
>>= :: WriterLazyC s m a -> (a -> WriterLazyC s m b) -> WriterLazyC s m b
$c>>= :: forall s (m :: * -> *) a b.
(Monoid s, Monad m) =>
WriterLazyC s m a -> (a -> WriterLazyC s m b) -> WriterLazyC s m b
$cp1Monad :: forall s (m :: * -> *).
(Monoid s, Monad m) =>
Applicative (WriterLazyC s m)
Monad
, Applicative (WriterLazyC s m)
WriterLazyC s m a
Applicative (WriterLazyC s m)
-> (forall a. WriterLazyC s m a)
-> (forall a.
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a)
-> (forall a. WriterLazyC s m a -> WriterLazyC s m [a])
-> (forall a. WriterLazyC s m a -> WriterLazyC s m [a])
-> Alternative (WriterLazyC s m)
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
WriterLazyC s m a -> WriterLazyC s m [a]
WriterLazyC s m a -> WriterLazyC s m [a]
forall a. WriterLazyC s m a
forall a. WriterLazyC s m a -> WriterLazyC s m [a]
forall a.
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
forall s (m :: * -> *).
(Monoid s, Alternative m) =>
Applicative (WriterLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
WriterLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
WriterLazyC s m a -> WriterLazyC s m [a]
forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s 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 :: WriterLazyC s m a -> WriterLazyC s m [a]
$cmany :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
WriterLazyC s m a -> WriterLazyC s m [a]
some :: WriterLazyC s m a -> WriterLazyC s m [a]
$csome :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
WriterLazyC s m a -> WriterLazyC s m [a]
<|> :: WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
$c<|> :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
empty :: WriterLazyC s m a
$cempty :: forall s (m :: * -> *) a.
(Monoid s, Alternative m) =>
WriterLazyC s m a
$cp1Alternative :: forall s (m :: * -> *).
(Monoid s, Alternative m) =>
Applicative (WriterLazyC s m)
Alternative, Monad (WriterLazyC s m)
Alternative (WriterLazyC s m)
WriterLazyC s m a
Alternative (WriterLazyC s m)
-> Monad (WriterLazyC s m)
-> (forall a. WriterLazyC s m a)
-> (forall a.
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a)
-> MonadPlus (WriterLazyC s m)
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
forall a. WriterLazyC s m a
forall a.
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Monad (WriterLazyC s m)
forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Alternative (WriterLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
WriterLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
mplus :: WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
$cmplus :: forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
WriterLazyC s m a -> WriterLazyC s m a -> WriterLazyC s m a
mzero :: WriterLazyC s m a
$cmzero :: forall s (m :: * -> *) a.
(Monoid s, MonadPlus m) =>
WriterLazyC s m a
$cp2MonadPlus :: forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Monad (WriterLazyC s m)
$cp1MonadPlus :: forall s (m :: * -> *).
(Monoid s, MonadPlus m) =>
Alternative (WriterLazyC s m)
MonadPlus
, Monad (WriterLazyC s m)
e -> WriterLazyC s m a
Monad (WriterLazyC s m)
-> (forall e a. Exception e => e -> WriterLazyC s m a)
-> MonadThrow (WriterLazyC s m)
forall e a. Exception e => e -> WriterLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadThrow m) =>
Monad (WriterLazyC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadThrow m, Exception e) =>
e -> WriterLazyC s m a
forall (m :: * -> *).
Monad m -> (forall e a. Exception e => e -> m a) -> MonadThrow m
throwM :: e -> WriterLazyC s m a
$cthrowM :: forall s (m :: * -> *) e a.
(Monoid s, MonadThrow m, Exception e) =>
e -> WriterLazyC s m a
$cp1MonadThrow :: forall s (m :: * -> *).
(Monoid s, MonadThrow m) =>
Monad (WriterLazyC s m)
MonadThrow, MonadThrow (WriterLazyC s m)
MonadThrow (WriterLazyC s m)
-> (forall e a.
Exception e =>
WriterLazyC s m a -> (e -> WriterLazyC s m a) -> WriterLazyC s m a)
-> MonadCatch (WriterLazyC s m)
WriterLazyC s m a -> (e -> WriterLazyC s m a) -> WriterLazyC s m a
forall e a.
Exception e =>
WriterLazyC s m a -> (e -> WriterLazyC s m a) -> WriterLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (WriterLazyC s m)
forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
WriterLazyC s m a -> (e -> WriterLazyC s m a) -> WriterLazyC s m a
forall (m :: * -> *).
MonadThrow m
-> (forall e a. Exception e => m a -> (e -> m a) -> m a)
-> MonadCatch m
catch :: WriterLazyC s m a -> (e -> WriterLazyC s m a) -> WriterLazyC s m a
$ccatch :: forall s (m :: * -> *) e a.
(Monoid s, MonadCatch m, Exception e) =>
WriterLazyC s m a -> (e -> WriterLazyC s m a) -> WriterLazyC s m a
$cp1MonadCatch :: forall s (m :: * -> *).
(Monoid s, MonadCatch m) =>
MonadThrow (WriterLazyC s m)
MonadCatch, MonadCatch (WriterLazyC s m)
MonadCatch (WriterLazyC s m)
-> (forall b.
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b)
-> (forall b.
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b)
-> (forall a b c.
WriterLazyC s m a
-> (a -> ExitCase b -> WriterLazyC s m c)
-> (a -> WriterLazyC s m b)
-> WriterLazyC s m (b, c))
-> MonadMask (WriterLazyC s m)
WriterLazyC s m a
-> (a -> ExitCase b -> WriterLazyC s m c)
-> (a -> WriterLazyC s m b)
-> WriterLazyC s m (b, c)
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
forall b.
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
forall a b c.
WriterLazyC s m a
-> (a -> ExitCase b -> WriterLazyC s m c)
-> (a -> WriterLazyC s m b)
-> WriterLazyC s m (b, c)
forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (WriterLazyC s m)
forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
WriterLazyC s m a
-> (a -> ExitCase b -> WriterLazyC s m c)
-> (a -> WriterLazyC s m b)
-> WriterLazyC s m (b, c)
forall (m :: * -> *).
MonadCatch m
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b. ((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
generalBracket :: WriterLazyC s m a
-> (a -> ExitCase b -> WriterLazyC s m c)
-> (a -> WriterLazyC s m b)
-> WriterLazyC s m (b, c)
$cgeneralBracket :: forall s (m :: * -> *) a b c.
(Monoid s, MonadMask m) =>
WriterLazyC s m a
-> (a -> ExitCase b -> WriterLazyC s m c)
-> (a -> WriterLazyC s m b)
-> WriterLazyC s m (b, c)
uninterruptibleMask :: ((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
$cuninterruptibleMask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
mask :: ((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
$cmask :: forall s (m :: * -> *) b.
(Monoid s, MonadMask m) =>
((forall a. WriterLazyC s m a -> WriterLazyC s m a)
-> WriterLazyC s m b)
-> WriterLazyC s m b
$cp1MonadMask :: forall s (m :: * -> *).
(Monoid s, MonadMask m) =>
MonadCatch (WriterLazyC s m)
MonadMask
, Monad (WriterLazyC s m)
Monad (WriterLazyC s m)
-> (forall a. (a -> WriterLazyC s m a) -> WriterLazyC s m a)
-> MonadFix (WriterLazyC s m)
(a -> WriterLazyC s m a) -> WriterLazyC s m a
forall a. (a -> WriterLazyC s m a) -> WriterLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadFix m) =>
Monad (WriterLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadFix m) =>
(a -> WriterLazyC s m a) -> WriterLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. (a -> m a) -> m a) -> MonadFix m
mfix :: (a -> WriterLazyC s m a) -> WriterLazyC s m a
$cmfix :: forall s (m :: * -> *) a.
(Monoid s, MonadFix m) =>
(a -> WriterLazyC s m a) -> WriterLazyC s m a
$cp1MonadFix :: forall s (m :: * -> *).
(Monoid s, MonadFix m) =>
Monad (WriterLazyC s m)
MonadFix, Monad (WriterLazyC s m)
Monad (WriterLazyC s m)
-> (forall a. String -> WriterLazyC s m a)
-> MonadFail (WriterLazyC s m)
String -> WriterLazyC s m a
forall a. String -> WriterLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadFail m) =>
Monad (WriterLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadFail m) =>
String -> WriterLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
fail :: String -> WriterLazyC s m a
$cfail :: forall s (m :: * -> *) a.
(Monoid s, MonadFail m) =>
String -> WriterLazyC s m a
$cp1MonadFail :: forall s (m :: * -> *).
(Monoid s, MonadFail m) =>
Monad (WriterLazyC s m)
MonadFail, Monad (WriterLazyC s m)
Monad (WriterLazyC s m)
-> (forall a. IO a -> WriterLazyC s m a)
-> MonadIO (WriterLazyC s m)
IO a -> WriterLazyC s m a
forall a. IO a -> WriterLazyC s m a
forall s (m :: * -> *).
(Monoid s, MonadIO m) =>
Monad (WriterLazyC s m)
forall s (m :: * -> *) a.
(Monoid s, MonadIO m) =>
IO a -> WriterLazyC s m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> WriterLazyC s m a
$cliftIO :: forall s (m :: * -> *) a.
(Monoid s, MonadIO m) =>
IO a -> WriterLazyC s m a
$cp1MonadIO :: forall s (m :: * -> *).
(Monoid s, MonadIO m) =>
Monad (WriterLazyC s m)
MonadIO
, MonadBase b, MonadBaseControl b
)
deriving (m a -> WriterLazyC s m a
(forall (m :: * -> *) a. Monad m => m a -> WriterLazyC s m a)
-> MonadTrans (WriterLazyC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m a -> WriterLazyC s m a
forall (m :: * -> *) a. Monad m => m a -> WriterLazyC s m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> WriterLazyC s m a
$clift :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m a -> WriterLazyC s m a
MonadTrans, MonadTrans (WriterLazyC s)
m (StT (WriterLazyC s) a) -> WriterLazyC s m a
MonadTrans (WriterLazyC s)
-> (forall (m :: * -> *) a.
Monad m =>
(Run (WriterLazyC s) -> m a) -> WriterLazyC s m a)
-> (forall (m :: * -> *) a.
Monad m =>
m (StT (WriterLazyC s) a) -> WriterLazyC s m a)
-> MonadTransControl (WriterLazyC s)
(Run (WriterLazyC s) -> m a) -> WriterLazyC s m a
forall s. Monoid s => MonadTrans (WriterLazyC s)
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (WriterLazyC s) a) -> WriterLazyC s m a
forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (WriterLazyC s) -> m a) -> WriterLazyC s m a
forall (m :: * -> *) a.
Monad m =>
m (StT (WriterLazyC s) a) -> WriterLazyC s m a
forall (m :: * -> *) a.
Monad m =>
(Run (WriterLazyC s) -> m a) -> WriterLazyC s m a
forall (t :: (* -> *) -> * -> *).
MonadTrans t
-> (forall (m :: * -> *) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: * -> *) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
restoreT :: m (StT (WriterLazyC s) a) -> WriterLazyC s m a
$crestoreT :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
m (StT (WriterLazyC s) a) -> WriterLazyC s m a
liftWith :: (Run (WriterLazyC s) -> m a) -> WriterLazyC s m a
$cliftWith :: forall s (m :: * -> *) a.
(Monoid s, Monad m) =>
(Run (WriterLazyC s) -> m a) -> WriterLazyC s m a
$cp1MonadTransControl :: forall s. Monoid s => MonadTrans (WriterLazyC s)
MonadTransControl)
instance ( Monoid s
, Carrier m
, Threads (LW.WriterT s) (Prims m)
)
=> Carrier (WriterLazyC s m) where
type Derivs (WriterLazyC s m) = Pass s ': Listen s ': Tell s ': Derivs m
type Prims (WriterLazyC s m) = WriterPrim s ': Prims m
algPrims :: Algebra' (Prims (WriterLazyC s m)) (WriterLazyC s m) a
algPrims =
Algebra' (ListenPrim s : Prims m) (WriterLazyC s m) a
-> (WriterLazyC s m (s -> s, a) -> WriterLazyC s m a)
-> Algebra' (WriterPrim s : Prims m) (WriterLazyC s m) a
forall w (p :: [(* -> *) -> * -> *]) (m :: * -> *) a.
Algebra' (ListenPrim w : p) m a
-> (m (w -> w, a) -> m a) -> Algebra' (WriterPrim w : p) m a
algListenPrimIntoWriterPrim (
Algebra' (ListenPrim s : Prims m) (ListenLazyC s m) a
-> Algebra' (ListenPrim s : Prims m) (WriterLazyC s m) a
coerce (forall a.
Carrier (ListenLazyC s m) =>
Algebra' (Prims (ListenLazyC s m)) (ListenLazyC s m) a
forall (m :: * -> *) a. Carrier m => Algebra' (Prims m) m a
algPrims @(ListenLazyC s m))
) ((WriterLazyC s m (s -> s, a) -> WriterLazyC s m a)
-> Algebra' (WriterPrim s : Prims m) (WriterLazyC s m) a)
-> (WriterLazyC s m (s -> s, a) -> WriterLazyC s m a)
-> Algebra' (WriterPrim s : Prims m) (WriterLazyC s m) a
forall a b. (a -> b) -> a -> b
$ \(WriterLazyC WriterT s m (s -> s, a)
m) -> WriterT s m a -> WriterLazyC s m a
forall s (m :: * -> *) a. WriterT s m a -> WriterLazyC s m a
WriterLazyC (WriterT s m a -> WriterLazyC s m a)
-> WriterT s m a -> WriterLazyC s m a
forall a b. (a -> b) -> a -> b
$ WriterT s m (a, s -> s) -> WriterT s m a
forall (m :: * -> *) w a.
Monad m =>
WriterT w m (a, w -> w) -> WriterT w m a
LW.pass ((s -> s, a) -> (a, s -> s)
forall a b. (a, b) -> (b, a)
swap ((s -> s, a) -> (a, s -> s))
-> WriterT s m (s -> s, a) -> WriterT s m (a, s -> s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> WriterT s m (s -> s, a)
m)
{-# INLINEABLE algPrims #-}
reformulate :: Reformulation'
(Derivs (WriterLazyC s m))
(Prims (WriterLazyC s m))
(WriterLazyC s m)
z
a
reformulate forall x. WriterLazyC s m x -> z x
n Algebra (Prims (WriterLazyC s m)) z
alg =
Algebra' (Listen s : Tell s : Derivs m) z a
-> (Pass s z a -> z a)
-> Algebra' (Pass s : Listen s : Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Algebra' (Tell s : Derivs m) z a
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
RepresentationalEff e =>
Algebra' r m a -> (e m a -> m a) -> Algebra' (e : r) m a
powerAlg (
Reformulation' (Tell s : Derivs m) (Prims m) (TellLazyC s m) z a
-> Reformulation'
(Tell s : Derivs m) (Prims m) (WriterLazyC s m) z a
forall (m :: * -> *) (n :: * -> *) (r :: [(* -> *) -> * -> *])
(p :: [(* -> *) -> * -> *]) (z :: * -> *) a.
Coercible m n =>
Reformulation' r p m z a -> Reformulation' r p n z a
coerceReform (forall (z :: * -> *) a.
(Carrier (TellLazyC s m), Monad z) =>
Reformulation'
(Derivs (TellLazyC s m))
(Prims (TellLazyC s m))
(TellLazyC s m)
z
a
forall (m :: * -> *) (z :: * -> *) a.
(Carrier m, Monad z) =>
Reformulation' (Derivs m) (Prims m) m z a
reformulate @(TellLazyC s m)) forall x. WriterLazyC s m x -> z x
n (Algebra' (WriterPrim s : Prims m) z x -> Algebra' (Prims m) z x
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Algebra' (e : r) m a -> Algebra' r m a
weakenAlg Algebra' (WriterPrim s : Prims m) z x
Algebra (Prims (WriterLazyC s m)) z
alg)
) ((Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a)
-> (Listen s z a -> z a)
-> Algebra' (Listen s : Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Listen z a
m -> (Union (WriterPrim s : Prims m) z (s, a) -> z a
Algebra (Prims (WriterLazyC s m)) z
alg (Union (WriterPrim s : Prims m) z (s, a) -> z a)
-> (WriterPrim s z (s, a)
-> Union (WriterPrim s : Prims m) z (s, a))
-> WriterPrim s z (s, a)
-> z a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterPrim s z (s, a) -> Union (WriterPrim s : Prims m) z (s, a)
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Member e r =>
e m a -> Union r m a
inj) (WriterPrim s z (s, a) -> z a) -> WriterPrim s z (s, a) -> z a
forall a b. (a -> b) -> a -> b
$ z a -> WriterPrim s z (s, a)
forall (m :: * -> *) a w. m a -> WriterPrim w m (w, a)
WriterPrimListen z a
m
) ((Pass s z a -> z a)
-> Algebra' (Pass s : Listen s : Tell s : Derivs m) z a)
-> (Pass s z a -> z a)
-> Algebra' (Pass s : Listen s : Tell s : Derivs m) z a
forall a b. (a -> b) -> a -> b
$ \case
Pass z (s -> s, a)
m -> (Union (WriterPrim s : Prims m) z a -> z a
Algebra (Prims (WriterLazyC s m)) z
alg (Union (WriterPrim s : Prims m) z a -> z a)
-> (WriterPrim s z a -> Union (WriterPrim s : Prims m) z a)
-> WriterPrim s z a
-> z a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. WriterPrim s z a -> Union (WriterPrim s : Prims m) z a
forall (e :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *])
(m :: * -> *) a.
Member e r =>
e m a -> Union r m a
inj) (WriterPrim s z a -> z a) -> WriterPrim s z a -> z a
forall a b. (a -> b) -> a -> b
$ z (s -> s, a) -> WriterPrim s z a
forall (m :: * -> *) w a. m (w -> w, a) -> WriterPrim w m a
WriterPrimPass z (s -> s, a)
m
{-# INLINEABLE reformulate #-}
class ( forall s. Monoid s => Threads (WriterT s) p
) => WriterThreads p
instance ( forall s. Monoid s => Threads (WriterT s) p
) => WriterThreads p
class ( forall s. Monoid s => Threads (LW.WriterT s) p
) => WriterLazyThreads p
instance ( forall s. Monoid s => Threads (LW.WriterT s) p
) => WriterLazyThreads p