{-# 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

-- | An effect for arbitrary output.
data Tell s m a where
  Tell :: s -> Tell s m ()

-- | An effect for hearing what a computation
-- has to 'Control.Effect.Writer.tell'.
data Listen s m a where
  Listen :: m a -> Listen s m (s, a)

-- | An effect for altering what a computation
-- 'Control.Effect.Writer.tell's.
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 #-}

-- | 'WriterThreads' accepts the following primitive effects:
--
-- * 'Control.Effect.Regional.Regional' @s@
-- * 'Control.Effect.Optional.Optional' @s@ (when @s@ is a functor)
-- * 'Control.Effect.BaseControl.BaseControl' @b@
-- * 'Control.Effect.Type.ListenPrim.ListenPrim' @s@ (when @s@ is a 'Monoid')
-- * 'Control.Effect.Type.WriterPrim.WriterPrim' @s@ (when @s@ is a 'Monoid')
-- * 'Control.Effect.Type.ReaderPrim.ReaderPrim' @i@
-- * 'Control.Effect.Mask.Mask'
-- * 'Control.Effect.Bracket.Bracket'
-- * 'Control.Effect.Fix.Fix'
-- * 'Control.Effect.NonDet.Split'
class    ( forall s. Monoid s => Threads (WriterT s) p
         ) => WriterThreads p
instance ( forall s. Monoid s => Threads (WriterT s) p
         ) => WriterThreads p

-- | 'WriterLazyThreads' accepts the following primitive effects:
--
-- * 'Control.Effect.Regional.Regional' @s@
-- * 'Control.Effect.Optional.Optional' @s@ (when @s@ is a functor)
-- * 'Control.Effect.BaseControl.BaseControl' @b@
-- * 'Control.Effect.Type.ListenPrim.ListenPrim' @s@ (when @s@ is a 'Monoid')
-- * 'Control.Effect.Type.WriterPrim.WriterPrim' @s@ (when @s@ is a 'Monoid')
-- * 'Control.Effect.Type.ReaderPrim.ReaderPrim' @i@
-- * 'Control.Effect.Mask.Mask'
-- * 'Control.Effect.Bracket.Bracket'
-- * 'Control.Effect.Fix.Fix'
-- * 'Control.Effect.NonDet.Split'
class    ( forall s. Monoid s => Threads (LW.WriterT s) p
         ) => WriterLazyThreads p
instance ( forall s. Monoid s => Threads (LW.WriterT s) p
         ) => WriterLazyThreads p