{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE PolyKinds #-}
module Effectful.Labeled
(
Labeled
, runLabeled
, labeled
) where
import Unsafe.Coerce (unsafeCoerce)
import Effectful
import Effectful.Dispatch.Static
data Labeled (label :: k) (e :: Effect) :: Effect
type instance DispatchOf (Labeled label e) = Static NoSideEffects
data instance StaticRep (Labeled label e)
runLabeled
:: forall label e es a b
. (Eff (e : es) a -> Eff es b)
-> Eff (Labeled label e : es) a
-> Eff es b
runLabeled :: forall {k} (label :: k) (e :: Effect) (es :: [Effect]) a b.
(Eff (e : es) a -> Eff es b)
-> Eff (Labeled label e : es) a -> Eff es b
runLabeled Eff (e : es) a -> Eff es b
runE Eff (Labeled label e : es) a
m = Eff (e : es) a -> Eff es b
runE (forall {k} (label :: k) (e :: Effect) (es :: [Effect]) a.
Eff (Labeled label e : es) a -> Eff (e : es) a
fromLabeled Eff (Labeled label e : es) a
m)
labeled
:: forall label e es a
. Labeled label e :> es
=> Eff (e : es) a
-> Eff es a
labeled :: forall {k} (label :: k) (e :: Effect) (es :: [Effect]) a.
(Labeled label e :> es) =>
Eff (e : es) a -> Eff es a
labeled Eff (e : es) a
m = forall (e :: Effect) (es :: [Effect]) a.
(e :> es) =>
Eff (e : es) a -> Eff es a
subsume @(Labeled label e) (forall {k} (e :: Effect) (es :: [Effect]) a (label :: k).
Eff (e : es) a -> Eff (Labeled label e : es) a
toLabeled Eff (e : es) a
m)
fromLabeled :: Eff (Labeled label e : es) a -> Eff (e : es) a
fromLabeled :: forall {k} (label :: k) (e :: Effect) (es :: [Effect]) a.
Eff (Labeled label e : es) a -> Eff (e : es) a
fromLabeled = forall a b. a -> b
unsafeCoerce
toLabeled :: Eff (e : es) a -> Eff (Labeled label e : es) a
toLabeled :: forall {k} (e :: Effect) (es :: [Effect]) a (label :: k).
Eff (e : es) a -> Eff (Labeled label e : es) a
toLabeled = forall a b. a -> b
unsafeCoerce