module Control.Effect.Machinery.Via
(
EachVia(..)
, Via
, G
, SomeMonad
, Effect
, Transformer
, Handle
, Find
, Lift
, Control
) where
import Control.Monad.IO.Class (MonadIO)
import Data.Kind (Constraint, Type)
import Control.Monad.Trans.Control (ComposeSt, MonadBaseControl,
MonadTransControl, StM, defaultLiftBaseWith,
defaultRestoreM,liftBaseWith, restoreM)
import Control.Monad.Trans.Class (MonadTrans)
import Control.Monad.Base (MonadBase, liftBase, liftBaseDefault)
newtype EachVia (effs :: [Effect]) (t :: Transformer) m a =
EachVia { EachVia effs t m a -> t m a
runVia :: t m a }
deriving (Functor (EachVia effs t m)
a -> EachVia effs t m a
Functor (EachVia effs t m) =>
(forall a. a -> EachVia effs t m a)
-> (forall a b.
EachVia effs t m (a -> b)
-> EachVia effs t m a -> EachVia effs t m b)
-> (forall a b c.
(a -> b -> c)
-> EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m c)
-> (forall a b.
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b)
-> (forall a b.
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m a)
-> Applicative (EachVia effs t m)
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m a
EachVia effs t m (a -> b)
-> EachVia effs t m a -> EachVia effs t m b
(a -> b -> c)
-> EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m c
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad).
Applicative (t m) =>
Functor (EachVia effs t m)
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
Applicative (t m) =>
a -> EachVia effs t m a
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Applicative (t m) =>
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m a
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Applicative (t m) =>
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Applicative (t m) =>
EachVia effs t m (a -> b)
-> EachVia effs t m a -> EachVia effs t m b
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b
c.
Applicative (t m) =>
(a -> b -> c)
-> EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m c
forall a. a -> EachVia effs t m a
forall a b.
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m a
forall a b.
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
forall a b.
EachVia effs t m (a -> b)
-> EachVia effs t m a -> EachVia effs t m b
forall a b c.
(a -> b -> c)
-> EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m c
forall (f :: SomeMonad).
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
<* :: EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m a
$c<* :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Applicative (t m) =>
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m a
*> :: EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
$c*> :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Applicative (t m) =>
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
liftA2 :: (a -> b -> c)
-> EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m c
$cliftA2 :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b
c.
Applicative (t m) =>
(a -> b -> c)
-> EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m c
<*> :: EachVia effs t m (a -> b)
-> EachVia effs t m a -> EachVia effs t m b
$c<*> :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Applicative (t m) =>
EachVia effs t m (a -> b)
-> EachVia effs t m a -> EachVia effs t m b
pure :: a -> EachVia effs t m a
$cpure :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
Applicative (t m) =>
a -> EachVia effs t m a
$cp1Applicative :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad).
Applicative (t m) =>
Functor (EachVia effs t m)
Applicative, a -> EachVia effs t m b -> EachVia effs t m a
(a -> b) -> EachVia effs t m a -> EachVia effs t m b
(forall a b. (a -> b) -> EachVia effs t m a -> EachVia effs t m b)
-> (forall a b. a -> EachVia effs t m b -> EachVia effs t m a)
-> Functor (EachVia effs t m)
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Functor (t m) =>
a -> EachVia effs t m b -> EachVia effs t m a
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Functor (t m) =>
(a -> b) -> EachVia effs t m a -> EachVia effs t m b
forall a b. a -> EachVia effs t m b -> EachVia effs t m a
forall a b. (a -> b) -> EachVia effs t m a -> EachVia effs t m b
forall (f :: SomeMonad).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> EachVia effs t m b -> EachVia effs t m a
$c<$ :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Functor (t m) =>
a -> EachVia effs t m b -> EachVia effs t m a
fmap :: (a -> b) -> EachVia effs t m a -> EachVia effs t m b
$cfmap :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Functor (t m) =>
(a -> b) -> EachVia effs t m a -> EachVia effs t m b
Functor, Applicative (EachVia effs t m)
a -> EachVia effs t m a
Applicative (EachVia effs t m) =>
(forall a b.
EachVia effs t m a
-> (a -> EachVia effs t m b) -> EachVia effs t m b)
-> (forall a b.
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b)
-> (forall a. a -> EachVia effs t m a)
-> Monad (EachVia effs t m)
EachVia effs t m a
-> (a -> EachVia effs t m b) -> EachVia effs t m b
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad).
Monad (t m) =>
Applicative (EachVia effs t m)
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
Monad (t m) =>
a -> EachVia effs t m a
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Monad (t m) =>
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Monad (t m) =>
EachVia effs t m a
-> (a -> EachVia effs t m b) -> EachVia effs t m b
forall a. a -> EachVia effs t m a
forall a b.
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
forall a b.
EachVia effs t m a
-> (a -> EachVia effs t m b) -> EachVia effs t m b
forall (m :: SomeMonad).
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 -> EachVia effs t m a
$creturn :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
Monad (t m) =>
a -> EachVia effs t m a
>> :: EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
$c>> :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Monad (t m) =>
EachVia effs t m a -> EachVia effs t m b -> EachVia effs t m b
>>= :: EachVia effs t m a
-> (a -> EachVia effs t m b) -> EachVia effs t m b
$c>>= :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a b.
Monad (t m) =>
EachVia effs t m a
-> (a -> EachVia effs t m b) -> EachVia effs t m b
$cp1Monad :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad).
Monad (t m) =>
Applicative (EachVia effs t m)
Monad, Monad (EachVia effs t m)
Monad (EachVia effs t m) =>
(forall a. IO a -> EachVia effs t m a)
-> MonadIO (EachVia effs t m)
IO a -> EachVia effs t m a
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad).
MonadIO (t m) =>
Monad (EachVia effs t m)
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
MonadIO (t m) =>
IO a -> EachVia effs t m a
forall a. IO a -> EachVia effs t m a
forall (m :: SomeMonad).
Monad m =>
(forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> EachVia effs t m a
$cliftIO :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
MonadIO (t m) =>
IO a -> EachVia effs t m a
$cp1MonadIO :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad).
MonadIO (t m) =>
Monad (EachVia effs t m)
MonadIO)
deriving (m a -> EachVia effs t m a
(forall (m :: SomeMonad) a. Monad m => m a -> EachVia effs t m a)
-> MonadTrans (EachVia effs t)
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
(MonadTrans t, Monad m) =>
m a -> EachVia effs t m a
forall (m :: SomeMonad) a. Monad m => m a -> EachVia effs t m a
forall (t :: Transformer).
(forall (m :: SomeMonad) a. Monad m => m a -> t m a)
-> MonadTrans t
lift :: m a -> EachVia effs t m a
$clift :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
(MonadTrans t, Monad m) =>
m a -> EachVia effs t m a
MonadTrans, MonadTrans (EachVia effs t)
m (StT (EachVia effs t) a) -> EachVia effs t m a
MonadTrans (EachVia effs t) =>
(forall (m :: SomeMonad) a.
Monad m =>
(Run (EachVia effs t) -> m a) -> EachVia effs t m a)
-> (forall (m :: SomeMonad) a.
Monad m =>
m (StT (EachVia effs t) a) -> EachVia effs t m a)
-> MonadTransControl (EachVia effs t)
(Run (EachVia effs t) -> m a) -> EachVia effs t m a
forall (effs :: [Effect]) (t :: Transformer).
MonadTransControl t =>
MonadTrans (EachVia effs t)
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
(MonadTransControl t, Monad m) =>
m (StT (EachVia effs t) a) -> EachVia effs t m a
forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
(MonadTransControl t, Monad m) =>
(Run (EachVia effs t) -> m a) -> EachVia effs t m a
forall (m :: SomeMonad) a.
Monad m =>
m (StT (EachVia effs t) a) -> EachVia effs t m a
forall (m :: SomeMonad) a.
Monad m =>
(Run (EachVia effs t) -> m a) -> EachVia effs t m a
forall (t :: Transformer).
MonadTrans t =>
(forall (m :: SomeMonad) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: SomeMonad) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
restoreT :: m (StT (EachVia effs t) a) -> EachVia effs t m a
$crestoreT :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
(MonadTransControl t, Monad m) =>
m (StT (EachVia effs t) a) -> EachVia effs t m a
liftWith :: (Run (EachVia effs t) -> m a) -> EachVia effs t m a
$cliftWith :: forall (effs :: [Effect]) (t :: Transformer) (m :: SomeMonad) a.
(MonadTransControl t, Monad m) =>
(Run (EachVia effs t) -> m a) -> EachVia effs t m a
$cp1MonadTransControl :: forall (effs :: [Effect]) (t :: Transformer).
MonadTransControl t =>
MonadTrans (EachVia effs t)
MonadTransControl)
instance (Monad (t m), MonadBase b m, MonadTrans t) => MonadBase b (EachVia effs t m) where
liftBase :: b α -> EachVia effs t m α
liftBase = b α -> EachVia effs t m α
forall (t :: Transformer) (b :: SomeMonad) (m :: SomeMonad) α.
(MonadTrans t, MonadBase b m) =>
b α -> t m α
liftBaseDefault
{-# INLINE liftBase #-}
instance (Monad (t m), MonadBaseControl b m, MonadTransControl t) => MonadBaseControl b (EachVia effs t m) where
type StM (EachVia effs t m) a = ComposeSt t m a
liftBaseWith :: (RunInBase (EachVia effs t m) b -> b a) -> EachVia effs t m a
liftBaseWith = (RunInBase (EachVia effs t m) b -> b a) -> EachVia effs t m a
forall (t :: Transformer) (b :: SomeMonad) (m :: SomeMonad) a.
(MonadTransControl t, MonadBaseControl b m) =>
(RunInBaseDefault t m b -> b a) -> t m a
defaultLiftBaseWith
{-# INLINE liftBaseWith #-}
restoreM :: StM (EachVia effs t m) a -> EachVia effs t m a
restoreM = StM (EachVia effs t m) a -> EachVia effs t m a
forall (t :: Transformer) (b :: SomeMonad) (m :: SomeMonad) a.
(MonadTransControl t, MonadBaseControl b m) =>
ComposeSt t m a -> t m a
defaultRestoreM
{-# INLINE restoreM #-}
type Via eff t m a = EachVia '[eff] t m a
data G
type SomeMonad = Type -> Type
type Effect = SomeMonad -> Constraint
type Transformer = SomeMonad -> Type -> Type
type Handle (eff :: Effect) (t :: Transformer) m =
eff (t m)
type Find eff effs t m = (Monad (t m), eff (EachVia effs t m))
type Lift (eff :: Effect) (t :: Transformer) m =
(eff m, Monad (t m), MonadTrans t)
type Control (eff :: Effect) (t :: Transformer) m =
(eff m, Monad (t m), MonadTransControl t)