heftia-0.5.0.0: higher-order algebraic effects done right
Copyright(c) 2016 Allele Dev; 2017 Ixperta Solutions s.r.o.; 2017 Alexis King; 2024 Sayo Koyoneda
LicenseMPL-2.0 (see the LICENSE file) AND BSD-3-Clause (see the LICENSE.BSD3 file)
Maintainerymdfield@outlook.jp
Safe HaskellNone
LanguageGHC2021

Data.Effect.OpenUnion.Internal.HO

Description

Implementation of an open union for higher-order effects.

Importing this module allows unsafe access to the data structure of the open union, so it should not usually be imported directly.

Based on the open union in freer-simple.

Synopsis

Documentation

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

Open union for higher-order effects.

Constructors

UnionH 

Fields

  • :: forall (e :: (Type -> Type) -> Type -> Type) (g :: Type -> Type) a (f :: Type -> Type) (es :: [EffectH]). !Word

    A natural number tag to identify the element of the union.

  • -> e g a

    The data of the higher-order effect that is an element of the union.

  • -> (g ~> f)

    Continuation of interpretation. Due to this component, hfmap for UnionH becomes faster (because it no longer requires the HFunctor dictionary), thus improving overall performance.

  • -> UnionH es f a
     

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 #

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

unsafeInjH :: forall e (f :: Type -> Type) a (es :: [EffectH]). Word -> e f a -> UnionH es f a Source #

unsafePrjH :: forall e (es :: [EffectH]) (f :: Type -> Type) a. HFunctor e => Word -> UnionH es f a -> Maybe (e 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 #

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

type MemberHBy (key :: k) (e :: EffectH) (es :: [EffectH]) = ((key ##> e) <<| es, LookupH key es ~ (key ##> e), IfKeyNotFound key es es) 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 

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 #

decomp0H :: forall e (f :: Type -> Type) a. HFunctor e => UnionH '[e] f a -> Either (UnionH ('[] :: [EffectH]) f a) (e 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 #

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

inj0H :: forall e (es :: [(Type -> Type) -> Type -> Type]) (f :: Type -> Type) a. e f a -> UnionH (e ': es) 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 #

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 #

weakenH :: forall (any :: EffectH) (es :: [EffectH]) (f :: Type -> Type) a. UnionH es f a -> UnionH (any ': 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 #

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 #

weakenUnderH :: forall (any :: EffectH) (e :: EffectH) (es :: [EffectH]) (f :: Type -> Type) a. UnionH (e ': es) f a -> UnionH (e ': (any ': 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 #

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 #

strengthenH :: forall (e :: EffectH) (es :: [EffectH]) (f :: Type -> Type) a. e <<| es => UnionH (e ': es) f a -> UnionH es f a Source #

strengthensH :: forall (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. Strengthen es es' => UnionH es f a -> UnionH es' 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 #

strengthenUnderH :: forall (e2 :: EffectH) (e1 :: EffectH) (es :: [EffectH]) (f :: Type -> Type) a. e2 <<| es => UnionH (e1 ': (e2 ': es)) f a -> UnionH (e1 ': es) f a Source #

strengthensUnderH :: forall (offset :: Natural) (es :: [EffectH]) (es' :: [EffectH]) (f :: Type -> Type) a. StrengthenUnder offset 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 #

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 #

bundleUnionNH :: forall (len :: Nat) (es :: [EffectH]) (f :: Type -> Type) a. KnownNat len => UnionH es f a -> UnionH (UnionH (Take len es) ': Drop len 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 #

unbundleUnionNH :: forall (len :: Nat) (es :: [EffectH]) (f :: Type -> Type) a. KnownNat len => UnionH (UnionH (Take len es) ': Drop len es) f a -> UnionH es 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 #

bundleUnionNUnderH :: forall (len :: Nat) (offset :: Nat) (es :: [EffectH]) (f :: Type -> Type) a. (KnownNat len, KnownNat offset) => UnionH es f a -> UnionH (Take offset es ++ (UnionH (Take len (Drop offset es)) ': Drop len (Drop offset 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 #

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

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

unbundleAllUnionH :: forall (es :: [EffectH]) (f :: Type -> Type) a. UnionH '[UnionH es] f a -> UnionH 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 #

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 #

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 #

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