{-# LANGUAGE AllowAmbiguousTypes #-}
{-# OPTIONS_HADDOCK not-home #-}
module Polysemy.Internal.Tactics
( Tactics (..)
, getInitialStateT
, getInspectorT
, Inspector (..)
, runT
, runTSimple
, bindT
, bindTSimple
, pureT
, liftT
, runTactics
, Tactical
, WithTactics
) where
import Polysemy.Internal
import Polysemy.Internal.Union
type Tactical e m r x = ∀ f. Functor f
=> Sem (WithTactics e f m r) (f x)
type WithTactics e f m r = Tactics f m (e ': r) ': r
data Tactics f n r m a where
GetInitialState :: Tactics f n r m (f ())
HoistInterpretation :: (a -> n b) -> Tactics f n r m (f a -> Sem r (f b))
HoistInterpretationH :: (a -> n b) -> f a -> Tactics f n r m (f b)
GetInspector :: Tactics f n r m (Inspector f)
getInitialStateT :: forall f m r e. Sem (WithTactics e f m r) (f ())
getInitialStateT :: forall (f :: * -> *) (m :: * -> *) (r :: [Effect]) (e :: Effect).
Sem (WithTactics e f m r) (f ())
getInitialStateT = forall (e :: Effect) (r :: [Effect]) a.
Member e r =>
e (Sem r) a -> Sem r a
send @(Tactics _ m (e ': r)) forall {k} (f :: * -> *) (n :: * -> *) (r :: [Effect]) (m :: k).
Tactics f n r m (f ())
GetInitialState
getInspectorT :: forall e f m r. Sem (WithTactics e f m r) (Inspector f)
getInspectorT :: forall (e :: Effect) (f :: * -> *) (m :: * -> *) (r :: [Effect]).
Sem (WithTactics e f m r) (Inspector f)
getInspectorT = forall (e :: Effect) (r :: [Effect]) a.
Member e r =>
e (Sem r) a -> Sem r a
send @(Tactics _ m (e ': r)) forall {k} (f :: * -> *) (n :: * -> *) (r :: [Effect]) (m :: k).
Tactics f n r m (Inspector f)
GetInspector
newtype Inspector f = Inspector
{ forall (f :: * -> *). Inspector f -> forall x. f x -> Maybe x
inspect :: forall x. f x -> Maybe x
}
pureT :: Functor f => a -> Sem (WithTactics e f m r) (f a)
pureT :: forall (f :: * -> *) a (e :: Effect) (m :: * -> *) (r :: [Effect]).
Functor f =>
a -> Sem (WithTactics e f m r) (f a)
pureT a
a = do
f ()
istate <- forall (f :: * -> *) (m :: * -> *) (r :: [Effect]) (e :: Effect).
Sem (WithTactics e f m r) (f ())
getInitialStateT
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ a
a forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ f ()
istate
runT
:: m a
-> Sem (WithTactics e f m r)
(Sem (e ': r) (f a))
runT :: forall (m :: * -> *) a (e :: Effect) (f :: * -> *) (r :: [Effect]).
m a -> Sem (WithTactics e f m r) (Sem (e : r) (f a))
runT m a
na = do
f ()
istate <- forall (f :: * -> *) (m :: * -> *) (r :: [Effect]) (e :: Effect).
Sem (WithTactics e f m r) (f ())
getInitialStateT
f () -> Sem (e : r) (f a)
na' <- forall a (m :: * -> *) b (e :: Effect) (f :: * -> *)
(r :: [Effect]).
(a -> m b) -> Sem (WithTactics e f m r) (f a -> Sem (e : r) (f b))
bindT (forall a b. a -> b -> a
const m a
na)
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ f () -> Sem (e : r) (f a)
na' f ()
istate
{-# INLINE runT #-}
runTSimple :: m a
-> Tactical e m r a
runTSimple :: forall (m :: * -> *) a (e :: Effect) (r :: [Effect]).
m a -> Tactical e m r a
runTSimple m a
na = do
f ()
istate <- forall (f :: * -> *) (m :: * -> *) (r :: [Effect]) (e :: Effect).
Sem (WithTactics e f m r) (f ())
getInitialStateT
forall (m :: * -> *) (f :: * -> *) (r :: [Effect]) (e :: Effect) a
b.
(a -> m b) -> f a -> Sem (WithTactics e f m r) (f b)
bindTSimple (forall a b. a -> b -> a
const m a
na) f ()
istate
{-# INLINE runTSimple #-}
bindT
:: (a -> m b)
-> Sem (WithTactics e f m r)
(f a -> Sem (e ': r) (f b))
bindT :: forall a (m :: * -> *) b (e :: Effect) (f :: * -> *)
(r :: [Effect]).
(a -> m b) -> Sem (WithTactics e f m r) (f a -> Sem (e : r) (f b))
bindT a -> m b
f = forall (e :: Effect) (r :: [Effect]) a.
Member e r =>
e (Sem r) a -> Sem r a
send forall a b. (a -> b) -> a -> b
$ forall {k} a (n :: * -> *) b (f :: * -> *) (r :: [Effect])
(m :: k).
(a -> n b) -> Tactics f n r m (f a -> Sem r (f b))
HoistInterpretation a -> m b
f
{-# INLINE bindT #-}
bindTSimple
:: forall m f r e a b
. (a -> m b)
-> f a
-> Sem (WithTactics e f m r) (f b)
bindTSimple :: forall (m :: * -> *) (f :: * -> *) (r :: [Effect]) (e :: Effect) a
b.
(a -> m b) -> f a -> Sem (WithTactics e f m r) (f b)
bindTSimple a -> m b
f f a
s = forall (e :: Effect) (r :: [Effect]) a.
Member e r =>
e (Sem r) a -> Sem r a
send @(Tactics _ _ (e ': r)) forall a b. (a -> b) -> a -> b
$ forall {k} a (n :: * -> *) b (f :: * -> *) (r :: [Effect])
(m :: k).
(a -> n b) -> f a -> Tactics f n r m (f b)
HoistInterpretationH a -> m b
f f a
s
{-# INLINE bindTSimple #-}
liftT
:: forall m f r e a
. Functor f
=> Sem r a
-> Sem (WithTactics e f m r) (f a)
liftT :: forall (m :: * -> *) (f :: * -> *) (r :: [Effect]) (e :: Effect) a.
Functor f =>
Sem r a -> Sem (WithTactics e f m r) (f a)
liftT Sem r a
m = do
a
a <- forall (e :: Effect) (r :: [Effect]) a. Sem r a -> Sem (e : r) a
raise Sem r a
m
forall (f :: * -> *) a (e :: Effect) (m :: * -> *) (r :: [Effect]).
Functor f =>
a -> Sem (WithTactics e f m r) (f a)
pureT a
a
{-# INLINE liftT #-}
runTactics
:: Functor f
=> f ()
-> (∀ x. f (m x) -> Sem r2 (f x))
-> (∀ x. f x -> Maybe x)
-> (∀ x. f (m x) -> Sem r (f x))
-> Sem (Tactics f m r2 ': r) a
-> Sem r a
runTactics :: forall (f :: * -> *) (m :: * -> *) (r2 :: [Effect]) (r :: [Effect])
a.
Functor f =>
f ()
-> (forall x. f (m x) -> Sem r2 (f x))
-> (forall x. f x -> Maybe x)
-> (forall x. f (m x) -> Sem r (f x))
-> Sem (Tactics f m r2 : r) a
-> Sem r a
runTactics f ()
s forall x. f (m x) -> Sem r2 (f x)
d forall x. f x -> Maybe x
v forall x. f (m x) -> Sem r (f x)
d' (Sem forall (m :: * -> *).
Monad m =>
(forall x.
Union (Tactics f m r2 : r) (Sem (Tactics f m r2 : r)) x -> m x)
-> m a
m) = forall (r :: [Effect]) a.
(forall (m :: * -> *).
Monad m =>
(forall x. Union r (Sem r) x -> m x) -> m a)
-> Sem r a
Sem forall a b. (a -> b) -> a -> b
$ \forall x. Union r (Sem r) x -> m x
k -> forall (m :: * -> *).
Monad m =>
(forall x.
Union (Tactics f m r2 : r) (Sem (Tactics f m r2 : r)) x -> m x)
-> m a
m forall a b. (a -> b) -> a -> b
$ \Union (Tactics f m r2 : r) (Sem (Tactics f m r2 : r)) x
u ->
case forall (e :: Effect) (r :: [Effect]) (m :: * -> *) a.
Union (e : r) m a -> Either (Union r m a) (Weaving e m a)
decomp Union (Tactics f m r2 : r) (Sem (Tactics f m r2 : r)) x
u of
Left Union r (Sem (Tactics f m r2 : r)) x
x -> forall x. Union r (Sem r) x -> m x
k forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) (n :: * -> *) (r :: [Effect]) a.
(forall x. m x -> n x) -> Union r m a -> Union r n a
hoist (forall (f :: * -> *) (m :: * -> *) (r2 :: [Effect]) (r :: [Effect])
a.
Functor f =>
f ()
-> (forall x. f (m x) -> Sem r2 (f x))
-> (forall x. f x -> Maybe x)
-> (forall x. f (m x) -> Sem r (f x))
-> Sem (Tactics f m r2 : r) a
-> Sem r a
runTactics f ()
s forall x. f (m x) -> Sem r2 (f x)
d forall x. f x -> Maybe x
v forall x. f (m x) -> Sem r (f x)
d') Union r (Sem (Tactics f m r2 : r)) x
x
Right (Weaving Tactics f m r2 (Sem rInitial) a
GetInitialState f ()
s' forall x. f (Sem rInitial x) -> Sem (Tactics f m r2 : r) (f x)
_ f a -> x
y forall x. f x -> Maybe x
_) ->
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ f a -> x
y forall a b. (a -> b) -> a -> b
$ f ()
s forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ f ()
s'
Right (Weaving (HoistInterpretation a -> m b
na) f ()
s' forall x. f (Sem rInitial x) -> Sem (Tactics f m r2 : r) (f x)
_ f a -> x
y forall x. f x -> Maybe x
_) -> do
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ f a -> x
y forall a b. (a -> b) -> a -> b
$ (forall x. f (m x) -> Sem r2 (f x)
d forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> m b
na) forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ f ()
s'
Right (Weaving (HoistInterpretationH a -> m b
na f a
fa) f ()
s' forall x. f (Sem rInitial x) -> Sem (Tactics f m r2 : r) (f x)
_ f a -> x
y forall x. f x -> Maybe x
_) -> do
(f a -> x
y forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ f ()
s')) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (r :: [Effect]) a.
Sem r a
-> forall (m :: * -> *).
Monad m =>
(forall x. Union r (Sem r) x -> m x) -> m a
runSem (forall x. f (m x) -> Sem r (f x)
d' (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> m b
na f a
fa)) forall x. Union r (Sem r) x -> m x
k
Right (Weaving Tactics f m r2 (Sem rInitial) a
GetInspector f ()
s' forall x. f (Sem rInitial x) -> Sem (Tactics f m r2 : r) (f x)
_ f a -> x
y forall x. f x -> Maybe x
_) -> do
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ f a -> x
y forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *). (forall x. f x -> Maybe x) -> Inspector f
Inspector forall x. f x -> Maybe x
v forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ f ()
s'
{-# INLINE runTactics #-}