heftia-0.5.0.0: higher-order algebraic effects done right
Copyright(c) 2024 Sayo Koyoneda
LicenseMPL-2.0 (see the LICENSE file)
Maintainerymdfield@outlook.jp
Safe HaskellNone
LanguageGHC2021

Data.Effect.OpenUnion

Description

 
Synopsis

Documentation

type family (xs :: [a]) ++ (ys :: [a]) :: [a] where ... infixr 5 Source #

Equations

('[] :: [a]) ++ (ys :: [a]) = ys 
(x ': xs :: [a]) ++ (ys :: [a]) = x ': (xs ++ ys) 

type Reverse (es :: [a]) = Reverse_ ('[] :: [a]) es Source #

type family ElemAt (i :: Natural) (es :: [k]) :: k where ... Source #

Equations

ElemAt 0 (e ': _1 :: [k]) = e 
ElemAt n (_1 ': es :: [k]) = ElemAt (n - 1) es 

class IsSuffixOf (es :: k) (es' :: k1) Source #

Minimal complete definition

prefixLen

Instances

Instances details
IsSuffixOf (es :: k) (es :: k) Source # 
Instance details

Defined in Data.Effect.OpenUnion.Internal

IsSuffixOf es es' => IsSuffixOf (es :: k) (e ': es' :: [a]) Source # 
Instance details

Defined in Data.Effect.OpenUnion.Internal

type WeakenN (len :: Natural) (es :: [a]) (es' :: [a]) = (es ~ Drop len es', KnownNat len) Source #

type BundleUnder (u :: [a] -> a) (offset :: Natural) (es :: [a]) (es' :: [a]) (bundle :: [a]) = (es' ~ (Take offset es ++ (u bundle ': Drop (Length bundle) (Drop offset es))), es ~ (Take offset es' ++ (bundle ++ Drop 1 (Drop offset es'))), bundle ~ Take (PrefixLength (Drop 1 (Drop offset es')) (Drop offset es)) (Drop offset es), KnownLength bundle, KnownNat offset, Length bundle ~ PrefixLength (Drop 1 (Drop offset es')) (Drop offset es)) Source #

type family Drop (n :: Natural) (es :: [a]) :: [a] where ... Source #

Equations

Drop 0 (es :: [a]) = es 
Drop n (e ': es :: [a]) = Drop (n - 1) es 

type Split (es :: [a]) (init :: [a]) (tail :: [a]) = (es ~ (init ++ tail), init ~ Take (PrefixLength tail es) es, tail ~ Drop (Length init) es, KnownLength init, Length init ~ PrefixLength tail es) Source #

type Strengthen (es :: [a]) (es' :: [a]) = (StrengthenMap (PrefixLength es' es) es es', KnownNat (PrefixLength es' es)) Source #

type StrengthenN (len :: Natural) (es :: [k]) (es' :: [k]) = (StrengthenMap len es es', KnownNat len) Source #

type StrengthenNUnder (len :: Natural) (offset :: Natural) (es :: [k]) (es' :: [k]) = (StrengthenMap len (Drop offset es) (Drop offset es'), KnownNat len, KnownNat offset) Source #

type StrengthenUnder (offset :: Natural) (es :: [k]) (es' :: [k]) = StrengthenNUnder (PrefixLength es' es) offset es es' Source #

type family Take (n :: Natural) (es :: [a]) :: [a] where ... Source #

Equations

Take 0 (es :: [a]) = '[] :: [a] 
Take n (e ': es :: [a]) = e ': Take (n - 1) es 

type WeakenNUnder (len :: Natural) (offset :: Natural) (es :: [a]) (es' :: [a]) = (WeakenN len (Drop offset es) (Drop offset es'), KnownNat offset) Source #

type WeakenUnder (offset :: Natural) (es :: [a]) (es' :: [a]) = (WeakenNUnder (PrefixLength es es') offset es es', KnownNat (PrefixLength es es')) Source #

class KnownNat (Length es) => KnownLength (es :: [a]) Source #

Instances

Instances details
KnownNat (Length es) => KnownLength (es :: [a]) Source # 
Instance details

Defined in Data.Effect.OpenUnion.Internal

type family Length (es :: [a]) :: Natural where ... Source #

Equations

Length ('[] :: [a]) = 0 
Length (e ': es :: [a]) = 1 + Length es 

type MemberHBy (key :: k) (e :: EffectH) (es :: [EffectH]) = ((key ##> e) <<| es, LookupH key es ~ (key ##> e), IfKeyNotFound key es es) Source #

data UnionH (es :: [EffectH]) (f :: Type -> Type) a Source #

Open union for higher-order effects.

Instances

Instances details
HFunctor (UnionH es) Source # 
Instance details

Defined in Data.Effect.OpenUnion.Internal.HO

Methods

hfmap :: forall (f :: Type -> Type) (g :: Type -> Type). (f :-> g) -> UnionH es f :-> UnionH es g #

inj0H :: forall e (es :: [(Type -> Type) -> Type -> Type]) (f :: Type -> Type) a. e f a -> UnionH (e ': es) f a Source #

class FindElem e es => MemberH (e :: EffectH) (es :: [EffectH]) where Source #

Methods

injH :: forall (f :: Type -> Type) a. e f a -> UnionH es f a Source #

prjH :: forall (f :: Type -> Type) a. HFunctor e => UnionH es f a -> Maybe (e f a) Source #

Instances

Instances details
(FindElem e es, IfNotFound e es es) => MemberH e es Source # 
Instance details

Defined in Data.Effect.OpenUnion.Internal.HO

Methods

injH :: forall (f :: Type -> Type) a. e f a -> UnionH es f a Source #

prjH :: forall (f :: Type -> Type) a. HFunctor e => UnionH es f a -> Maybe (e f a) Source #

injNH :: forall (i :: Nat) (es :: [(Type -> Type) -> Type -> Type]) (f :: Type -> Type) a. KnownNat i => ElemAt i es f a -> UnionH es f a Source #

type (<<|) = MemberH infix 3 Source #

extractH :: forall e (f :: Type -> Type) a. HFunctor e => UnionH '[e] f a -> e f a Source #

hfmapUnion :: forall (f :: Type -> Type) (g :: Type -> Type) (es :: [EffectH]) a. (f ~> g) -> UnionH es f a -> UnionH es g a Source #

nilH :: forall (f :: Type -> Type) a r. UnionH ('[] :: [EffectH]) f a -> r Source #

weakenNH :: forall (len :: Natural) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. WeakenN len es es' => UnionH es f a -> UnionH es' f a Source #

weakensH :: forall (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. IsSuffixOf es es' => UnionH es f a -> UnionH es' f a Source #

(!!+) :: forall e (f :: Type -> Type) a r (es :: [EffectH]). HFunctor e => (e f a -> r) -> (UnionH es f a -> r) -> UnionH (e ': es) f a -> r infixr 5 Source #

bundleAllUnionH :: forall (es :: [EffectH]) (f :: Type -> Type) a. UnionH es f a -> UnionH '[UnionH es] f a Source #

bundleUnionH :: forall (bundle :: [EffectH]) (es :: [EffectH]) (rest :: [EffectH]) (f :: Type -> Type) a. Split es bundle rest => UnionH es f a -> UnionH (UnionH bundle ': rest) f a Source #

bundleUnionUnderH :: forall (offset :: Natural) (bundle :: [EffectH]) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. BundleUnder UnionH offset es es' bundle => UnionH es f a -> UnionH es' f a Source #

decompH :: forall e (es :: [(Type -> Type) -> Type -> Type]) (f :: Type -> Type) a. HFunctor e => UnionH (e ': es) f a -> Either (UnionH es f a) (e f a) Source #

strengthenNH :: forall (len :: Natural) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. StrengthenN len es es' => UnionH es f a -> UnionH es' f a Source #

strengthenNUnderH :: forall (len :: Natural) (offset :: Natural) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. StrengthenNUnder len offset es es' => UnionH es f a -> UnionH es' f a Source #

unbundleAllUnionH :: forall (es :: [EffectH]) (f :: Type -> Type) a. UnionH '[UnionH es] f a -> UnionH es f a Source #

unbundleUnionH :: forall (bundle :: [EffectH]) (es :: [EffectH]) (rest :: [EffectH]) (f :: Type -> Type) a. Split es bundle rest => UnionH (UnionH bundle ': rest) f a -> UnionH es f a Source #

unbundleUnionUnderH :: forall (offset :: Natural) (bundle :: [EffectH]) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. BundleUnder UnionH offset es es' bundle => UnionH es' f a -> UnionH es f a Source #

weakenH :: forall (any :: EffectH) (es :: [EffectH]) (f :: Type -> Type) a. UnionH es f a -> UnionH (any ': es) f a Source #

weakenNUnderH :: forall (len :: Natural) (offset :: Natural) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. WeakenNUnder len offset es es' => UnionH es f a -> UnionH es' f a Source #

weakenUnderH :: forall (any :: EffectH) (e :: EffectH) (es :: [EffectH]) (f :: Type -> Type) a. UnionH (e ': es) f a -> UnionH (e ': (any ': es)) f a Source #

type family LookupH (key :: k) (r :: [(Type -> Type) -> Type -> Type]) :: EffectH where ... Source #

Equations

LookupH (key :: k) ((key ##> e) ': _1) = key ##> e 
LookupH (key :: k) (_1 ': r) = LookupH key r 

decomp0H :: forall e (f :: Type -> Type) a. HFunctor e => UnionH '[e] f a -> Either (UnionH ('[] :: [EffectH]) f a) (e f a) Source #

flipAllUnionH :: forall (es :: [EffectH]) (f :: Type -> Type) a. KnownLength es => UnionH es f a -> UnionH (Reverse es) f a Source #

flipUnionH :: forall (len :: Nat) (es :: [EffectH]) (f :: Type -> Type) a. KnownNat len => UnionH es f a -> UnionH (Reverse (Take len es) ++ Drop len es) f a Source #

flipUnionUnderH :: forall (len :: Nat) (offset :: Nat) (es :: [EffectH]) (f :: Type -> Type) a. (KnownNat len, KnownNat offset) => UnionH es f a -> UnionH (Take offset es ++ (Reverse (Take len (Drop offset es)) ++ Drop len (Drop offset es))) f a Source #

prefixUnionH :: forall (any :: [EffectH]) (es :: [EffectH]) (f :: Type -> Type) a. KnownLength any => UnionH es f a -> UnionH (any ++ es) f a Source #

prefixUnionUnderH :: forall (any :: [EffectH]) (offset :: Nat) (es :: [EffectH]) (f :: Type -> Type) a. (KnownLength any, KnownNat offset) => UnionH es f a -> UnionH (Take offset es ++ (any ++ Drop offset es)) f a Source #

prjNH :: forall (i :: Nat) (es :: [(Type -> Type) -> Type -> Type]) (f :: Type -> Type) a. (KnownNat i, HFunctor (ElemAt i es)) => UnionH es f a -> Maybe (ElemAt i es f a) Source #

suffixUnionH :: forall (any :: [EffectH]) (es :: [EffectH]) (f :: Type -> Type) a. UnionH es f a -> UnionH (es ++ any) f a Source #

suffixUnionOverNH :: forall (any :: [EffectH]) (offset :: Nat) (es :: [EffectH]) (f :: Type -> Type) a. (KnownLength any, KnownNat offset, KnownLength es) => UnionH es f a -> UnionH (Take (Length es - offset) es ++ (any ++ Drop (Length es - offset) es)) f a Source #

weakensUnderH :: forall (offset :: Natural) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. WeakenUnder offset es es' => UnionH es f a -> UnionH es' f a Source #

type (<|) = Member infix 3 Source #

extract :: Union '[e] a -> e a Source #

Specialised version of prj/decomp that works on an Union '[e] :: EffectF which contains only one specific summand. Hence the absence of Maybe, and Either.

O(1)

class FindElem e es => Member (e :: EffectF) (es :: [EffectF]) where Source #

A constraint that requires that a particular effect, e, is a member of the type-level list es. This is used to parameterize an Eff computation over an arbitrary list of first-order effects, so long as e is somewhere in the list.

For example, a computation that only needs access to a cell of mutable state containing an Integer would likely use the following type:

State Integer <| ef => Eff eh ef ()

Methods

inj :: e a -> Union es a Source #

Takes a request of type e :: EffectF, and injects it into the Union.

O(1)

prj :: Union es a -> Maybe (e a) Source #

Project a value of type Union (e ': es) :: EffectF into a possible summand of the type e :: EffectF. Nothing means that e :: EffectF is not the value stored in the Union (e ': es) :: EffectF.

O(1)

Instances

Instances details
(FindElem e es, IfNotFound e es es) => Member e es Source # 
Instance details

Defined in Data.Effect.OpenUnion.Internal.FO

Methods

inj :: e a -> Union es a Source #

prj :: Union es a -> Maybe (e a) Source #

decomp :: forall e (es :: [EffectF]) a. Union (e ': es) a -> Either (Union es a) (e a) Source #

Orthogonal decomposition of a Union (e ': es) :: EffectF. Right value is returned if the Union (e ': es) :: EffectF contains e :: EffectF, and Left when it doesn't. Notice that Left value contains Union es :: EffectF, i.e. it can not contain e :: EffectF.

O(1)

data Union (es :: [EffectF]) a Source #

Open union for first-order effects.

type MemberBy (key :: k) (e :: EffectF) (es :: [EffectF]) = ((key #> e) <| es, Lookup key es ~ (key #> e), IfKeyNotFound key es es) Source #

inj0 :: forall e (es :: [Type -> Type]) a. e a -> Union (e ': es) a Source #

injN :: forall (i :: Nat) (es :: [Type -> Type]) a. KnownNat i => ElemAt i es a -> Union es a Source #

nil :: Union ('[] :: [EffectF]) a -> r Source #

weakenN :: forall (len :: Natural) (es :: [EffectF]) (es' :: [EffectF]) a. WeakenN len es es' => Union es a -> Union es' a Source #

weakens :: forall (es :: [EffectF]) (es' :: [EffectF]) a. IsSuffixOf es es' => Union es a -> Union es' a Source #

(!+) :: forall e a r (es :: [EffectF]). (e a -> r) -> (Union es a -> r) -> Union (e ': es) a -> r infixr 5 Source #

bundleAllUnion :: forall (es :: [EffectF]) a. Union es a -> Union '[Union es] a Source #

bundleUnion :: forall (es :: [EffectF]) (bundle :: [EffectF]) (rest :: [EffectF]) a. Split es bundle rest => Union es a -> Union (Union bundle ': rest) a Source #

bundleUnionUnder :: forall (offset :: Natural) (bundle :: [EffectF]) (es :: [EffectF]) (es' :: [EffectF]) a. BundleUnder Union offset es es' bundle => Union es a -> Union es' a Source #

strengthen :: forall (e :: EffectF) (es :: [EffectF]) a. e <| es => Union (e ': es) a -> Union es a Source #

strengthenN :: forall (len :: Natural) (es :: [EffectF]) (es' :: [EffectF]) a. StrengthenN len es es' => Union es a -> Union es' a Source #

strengthenNUnder :: forall (len :: Natural) (offset :: Natural) (es :: [EffectF]) (es' :: [EffectF]) a. StrengthenNUnder len offset es es' => Union es a -> Union es' a Source #

strengthenUnder :: forall (e2 :: EffectF) (e1 :: EffectF) (es :: [EffectF]) a. e2 <| es => Union (e1 ': (e2 ': es)) a -> Union (e1 ': es) a Source #

unbundleAllUnion :: forall (es :: [EffectF]) a. Union '[Union es] a -> Union es a Source #

unbundleUnion :: forall (es :: [EffectF]) (bundle :: [EffectF]) (rest :: [EffectF]) a. Split es bundle rest => Union (Union bundle ': rest) a -> Union es a Source #

unbundleUnionUnder :: forall (offset :: Natural) (bundle :: [EffectF]) (es :: [EffectF]) (es' :: [EffectF]) a. BundleUnder Union offset es es' bundle => Union es' a -> Union es a Source #

weaken :: forall (any :: EffectF) (es :: [EffectF]) a. Union es a -> Union (any ': es) a Source #

Inject whole Union es into a weaker Union (any ': es) that has one more summand.

O(1)

weakenNUnder :: forall (len :: Natural) (offset :: Natural) (es :: [EffectF]) (es' :: [EffectF]) a. WeakenNUnder len offset es es' => Union es a -> Union es' a Source #

weakenUnder :: forall (any :: EffectF) (e :: EffectF) (es :: [EffectF]) a. Union (e ': es) a -> Union (e ': (any ': es)) a Source #

weakensUnder :: forall (offset :: Natural) (es :: [EffectF]) (es' :: [EffectF]) a. WeakenUnder offset es es' => Union es a -> Union es' a Source #

type family Lookup (key :: k) (r :: [Type -> Type]) :: EffectF where ... Source #

Equations

Lookup (key :: k) ((key #> e) ': _1) = key #> e 
Lookup (key :: k) (_1 ': r) = Lookup key r 

decomp0 :: Union '[e] a -> Either (Union ('[] :: [EffectF]) a) (e a) Source #

Specialized version of decomp for efficiency.

O(1)

flipAllUnion :: forall (es :: [EffectF]) a. KnownLength es => Union es a -> Union (Reverse es) a Source #

flipUnion :: forall (len :: Nat) (es :: [EffectF]) a. KnownNat len => Union es a -> Union (Reverse (Take len es) ++ Drop len es) a Source #

flipUnionUnder :: forall (len :: Nat) (offset :: Nat) (es :: [EffectF]) a. (KnownNat len, KnownNat offset) => Union es a -> Union (Take offset es ++ (Reverse (Take len (Drop offset es)) ++ Drop len (Drop offset es))) a Source #

prefixUnion :: forall (any :: [EffectF]) (es :: [EffectF]) a. KnownLength any => Union es a -> Union (any ++ es) a Source #

prefixUnionUnder :: forall (any :: [EffectF]) (offset :: Nat) (es :: [EffectF]) a. (KnownLength any, KnownNat offset) => Union es a -> Union (Take offset es ++ (any ++ Drop offset es)) a Source #

prjN :: forall (i :: Nat) (es :: [EffectF]) a. KnownNat i => Union es a -> Maybe (ElemAt i es a) Source #

suffixUnion :: forall (any :: [EffectF]) (es :: [EffectF]) a. Union es a -> Union (es ++ any) a Source #

suffixUnionOverN :: forall (any :: [EffectF]) (offset :: Nat) (es :: [EffectF]) a. (KnownLength any, KnownNat offset, KnownLength es) => Union es a -> Union (Take (Length es - offset) es ++ (any ++ Drop (Length es - offset) es)) a Source #

type (+) = (:+:) :: (Type -> Type) -> (Type -> Type) -> Type -> Type infixr 5 Source #

Sum for first-order effects.

type family SumToRecUnionList (u :: [k] -> k) (e :: k) :: [k] where ... Source #

type SumToRecUnion (u :: [k] -> k) (e :: k) = u (SumToRecUnionList u e) Source #

type U (u :: [k] -> k) (e :: k) = SumToRecUnion u e Source #

type UL (u :: [k] -> k) (e :: k) = SumToRecUnionList u e Source #