fused-effects-0.5.0.0: src/Control/Effect/Sum.hs
{-# LANGUAGE DeriveGeneric, DeriveTraversable, FlexibleInstances, KindSignatures, MultiParamTypeClasses, TypeOperators #-}
module Control.Effect.Sum
( (:+:)(..)
, Member(..)
) where
import GHC.Generics (Generic1)
data (f :+: g) (m :: * -> *) k
= L (f m k)
| R (g m k)
deriving (Eq, Foldable, Functor, Generic1, Ord, Show, Traversable)
infixr 4 :+:
class Member (sub :: (* -> *) -> (* -> *)) sup where
inj :: sub m a -> sup m a
prj :: sup m a -> Maybe (sub m a)
instance Member sub sub where
inj = id
prj = Just
instance {-# OVERLAPPABLE #-} Member sub (sub :+: sup) where
inj = L . inj
prj (L f) = Just f
prj _ = Nothing
instance {-# OVERLAPPABLE #-} Member sub sup => Member sub (sub' :+: sup) where
inj = R . inj
prj (R g) = prj g
prj _ = Nothing