data-effects-core-0.4.2.0: A basic framework for effect systems based on effects represented by GADTs.
Copyright(c) 2024-2025 Sayo contributors
LicenseMPL-2.0 (see the file LICENSE)
Maintainerymdfield@outlook.jp
Safe HaskellNone
LanguageGHC2021

Data.Effect.OpenUnion

Description

 
Synopsis

Documentation

data Union (es :: [Effect]) (f :: Type -> Type) a where Source #

Constructors

UnsafeUnion 

Fields

Instances

Instances details
HFunctor (Union es) Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

hfmap :: (forall x. f x -> g x) -> Union es f a -> Union es g a Source #

type OrderOf (Union es) Source # 
Instance details

Defined in Data.Effect.OpenUnion

hfmapUnion :: forall f g (es :: [Effect]) a. (forall x. f x -> g x) -> Union es f a -> Union es g a Source #

class FOEs (es :: [Effect]) Source #

The list es consists only of first-order effects.

Instances

Instances details
FOEs ('[] :: [Effect]) Source # 
Instance details

Defined in Data.Effect.OpenUnion

(FirstOrder e, FOEs es) => FOEs (e ': es) Source # 
Instance details

Defined in Data.Effect.OpenUnion

class PolyHFunctors (es :: [Effect]) Source #

The list es consists only of polynomial effects.

Instances

Instances details
PolyHFunctors ('[] :: [Effect]) Source # 
Instance details

Defined in Data.Effect.OpenUnion

(PolyHFunctor e, PolyHFunctors es) => PolyHFunctors (e ': es) Source # 
Instance details

Defined in Data.Effect.OpenUnion

coerceFOEs :: forall (es :: [Effect]) (f :: Type -> Type) a (g :: Type -> Type). FOEs es => Union es f a -> Union es g a Source #

newtype Membership (e :: Effect) (es :: [Effect]) Source #

Constructors

UnsafeMembership 

Fields

Instances

Instances details
Show (Membership e es) Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

showsPrec :: Int -> Membership e es -> ShowS #

show :: Membership e es -> String #

showList :: [Membership e es] -> ShowS #

Eq (Membership e es) Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

(==) :: Membership e es -> Membership e es -> Bool #

(/=) :: Membership e es -> Membership e es -> Bool #

pattern Here :: forall e (es :: [Effect]). Membership e (e ': es) Source #

pattern There :: Membership e es -> Membership e (e ': es) Source #

(!:>) :: forall (e :: Effect) (e' :: Effect) (es :: [Effect]) r. ((e :~: e') -> r) -> (Membership e es -> r) -> Membership e (e' ': es) -> r infixr 5 Source #

weakenFor :: forall (e :: Effect) (es :: [Effect]) (e' :: Effect). Membership e es -> Membership e (e' ': es) Source #

mapUnion :: forall (es :: [Effect]) (es' :: [Effect]) (f :: Type -> Type) a. (forall (e :: Effect). Membership e es -> Membership e es') -> Union es f a -> Union es' f a Source #

membershipAt :: forall (i :: Nat) (es :: [Effect]). KnownNat i => Membership (At i es) es Source #

compareMembership :: forall (e :: Effect) (es :: [Effect]) (e' :: Effect). Membership e es -> Membership e' es -> Maybe (e :~: e') Source #

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

Equations

At 0 (e ': es :: [k]) = e 
At n (e ': es :: [k]) = At (n - 1) es 
At _1 ('[] :: [k]) = TypeError ('Text "Effect index out of range") :: k 

intVal :: forall (n :: Nat). KnownNat n => Int Source #

data LabelResolver Source #

Instances

Instances details
type ResolverName LabelResolver Source # 
Instance details

Defined in Data.Effect.OpenUnion

type Discriminator LabelResolver e Source # 
Instance details

Defined in Data.Effect.OpenUnion

data KeyResolver Source #

Instances

Instances details
type ResolverName KeyResolver Source # 
Instance details

Defined in Data.Effect.OpenUnion

type Discriminator KeyResolver e Source # 
Instance details

Defined in Data.Effect.OpenUnion

data IdentityResolver Source #

Instances

Instances details
type ResolverName IdentityResolver Source # 
Instance details

Defined in Data.Effect.OpenUnion

type ResolverName IdentityResolver = "identity"
type Discriminator IdentityResolver e Source # 
Instance details

Defined in Data.Effect.OpenUnion

data KeyDiscriminator (key :: k) Source #

type family Discriminator resolver (e :: Effect) Source #

Instances

Instances details
type Discriminator IdentityResolver e Source # 
Instance details

Defined in Data.Effect.OpenUnion

type Discriminator KeyResolver e Source # 
Instance details

Defined in Data.Effect.OpenUnion

type Discriminator LabelResolver e Source # 
Instance details

Defined in Data.Effect.OpenUnion

type family KeyOf (e :: (Type -> Type) -> Type -> Type) where ... Source #

Equations

KeyOf (e # key) = KeyDiscriminator key 
KeyOf e = NoKeyDiscriminator 

type family ResolverName resolver :: Symbol Source #

Instances

Instances details
type ResolverName IdentityResolver Source # 
Instance details

Defined in Data.Effect.OpenUnion

type ResolverName IdentityResolver = "identity"
type ResolverName KeyResolver Source # 
Instance details

Defined in Data.Effect.OpenUnion

type ResolverName LabelResolver Source # 
Instance details

Defined in Data.Effect.OpenUnion

type (:>) (e :: Effect) (es :: [Effect]) = MemberBy LabelResolver (Discriminator LabelResolver e) e es infix 4 Source #

type Has (key :: k) (e :: Effect) (es :: [Effect]) = MemberBy KeyResolver (KeyDiscriminator key) (e # key) es Source #

type In (e :: Effect) (es :: [Effect]) = MemberBy IdentityResolver (IdentityDiscriminator e) e es infix 4 Source #

type KnownIndex (i :: Nat) (es :: [Effect]) = (KnownNat i, KnownOrder (At i es)) Source #

type FindByLabel label (e :: Effect) (es :: [Effect]) = MemberBy LabelResolver label e es Source #

type MemberBy resolver dscr (e :: Effect) (es :: [Effect]) = (FindBy resolver dscr (Discriminator resolver (HeadOf es)) e es, ErrorIfNotFound resolver dscr (Discriminator resolver (HeadOf es)) e es es, KnownOrder e) Source #

class (dscr ~ Discriminator resolver e, dscr' ~ Discriminator resolver (HeadOf r)) => FindBy resolver dscr dscr' (e :: Effect) (r :: [Effect]) | resolver dscr dscr' r -> e where Source #

Methods

findBy :: Membership e r Source #

Instances

Instances details
(dscr ~ Discriminator resolver e, dscr ~ Discriminator resolver e', e ~ e') => FindBy resolver dscr dscr e (e' ': r) Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

findBy :: Membership e (e' ': r) Source #

(dscr ~ Discriminator resolver e, dscr' ~ Discriminator resolver e', FindBy resolver dscr (Discriminator resolver (HeadOf r)) e r) => FindBy resolver dscr dscr' e (e' ': r) Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

findBy :: Membership e (e' ': r) Source #

membership :: forall resolver dscr (e :: Effect) (es :: [Effect]). FindBy resolver dscr (Discriminator resolver (HeadOf es)) e es => Membership e es Source #

labelMembership :: forall (e :: Effect) (es :: [Effect]). FindBy LabelResolver (LabelOf e) (LabelOf (HeadOf es)) e es => Membership e es Source #

keyMembership :: forall {k} (key :: k) (e :: Effect) (es :: [(Type -> Type) -> Type -> Type]). FindBy KeyResolver (KeyDiscriminator key) (KeyOf (HeadOf es)) (e # key) es => Membership (e # key) es Source #

class (dscr ~ Discriminator resolver e, dscr' ~ Discriminator resolver (HeadOf r)) => ErrorIfNotFound resolver dscr dscr' (e :: Effect) (r :: [Effect]) (w :: [Effect]) Source #

Instances

Instances details
(dscr ~ Discriminator resolver e, dscr' ~ Discriminator resolver (HeadOf r)) => ErrorIfNotFound resolver dscr dscr' e r w Source # 
Instance details

Defined in Data.Effect.OpenUnion

(TypeError ((((('Text "The effect \8216" ':<>: 'ShowType e) ':<>: 'Text "\8217 does not exist within the effect list") ':$$: (('Text " \8216" ':<>: 'ShowType w) ':<>: 'Text "\8217")) ':$$: ('Text "Resolver: " ':<>: 'Text (ResolverName resolver))) ':$$: ('Text "Discriminator: " ':<>: 'ShowType dscr)) :: Constraint, dscr ~ Discriminator resolver e, dscr' ~ Discriminator resolver (HeadOf ('[] :: [Effect]))) => ErrorIfNotFound resolver dscr dscr' e ('[] :: [Effect]) w Source # 
Instance details

Defined in Data.Effect.OpenUnion

(dscr ~ Discriminator resolver e, dscr ~ Discriminator resolver e', e ~ e') => ErrorIfNotFound resolver dscr dscr e (e' ': r) w Source # 
Instance details

Defined in Data.Effect.OpenUnion

(dscr ~ Discriminator resolver e, dscr' ~ Discriminator resolver e', ErrorIfNotFound resolver dscr (Discriminator resolver (HeadOf r)) e r w) => ErrorIfNotFound resolver dscr dscr' e (e' ': r) w Source # 
Instance details

Defined in Data.Effect.OpenUnion

type family HeadOf (es :: [k]) :: k where ... Source #

Equations

HeadOf (e ': es :: [k]) = e 

type KnownOrder (e :: Effect) = Elem e (OrderOf e) Source #

class order ~ OrderOf e => Elem (e :: Effect) (order :: EffectOrder) where Source #

Methods

inject :: forall (es :: [Effect]) (f :: Type -> Type) a. Membership e es -> e f a -> Union es f a Source #

project :: forall (es :: [Effect]) (f :: Type -> Type) a. Membership e es -> Union es f a -> Maybe (e f a) Source #

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

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

Instances

Instances details
FirstOrder e => Elem e 'FirstOrder Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

inject :: forall (es :: [Effect]) (f :: Type -> Type) a. Membership e es -> e f a -> Union es f a Source #

project :: forall (es :: [Effect]) (f :: Type -> Type) a. Membership e es -> Union es f a -> Maybe (e f a) Source #

(!:) :: forall (f :: Type -> Type) a r (es :: [Effect]). (e f a -> r) -> (Union es f a -> r) -> Union (e ': es) f a -> r Source #

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

(OrderOf e ~ 'HigherOrder, HFunctor e) => Elem e 'HigherOrder Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

inject :: forall (es :: [Effect]) (f :: Type -> Type) a. Membership e es -> e f a -> Union es f a Source #

project :: forall (es :: [Effect]) (f :: Type -> Type) a. Membership e es -> Union es f a -> Maybe (e f a) Source #

(!:) :: forall (f :: Type -> Type) a r (es :: [Effect]). (e f a -> r) -> (Union es f a -> r) -> Union (e ': es) f a -> r Source #

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

decomp :: forall e (es :: [Effect]) (f :: Type -> Type) a. (KnownOrder e, HFunctor e) => Union (e ': es) f a -> Either (e f a) (Union es f a) Source #

projectAnyOrder :: forall e (es :: [Effect]) (f :: Type -> Type) a. HFunctor e => Membership e es -> Union es f a -> Maybe (e f a) Source #

caseAnyOrder :: forall e (f :: Type -> Type) a r (es :: [Effect]). HFunctor e => (e f a -> r) -> (Union es f a -> r) -> Union (e ': es) f a -> r infixr 5 Source #

extractAnyOrder :: forall e (es :: [Effect]) (f :: Type -> Type) a. HFunctor e => Union es f a -> e f a Source #

hfmapDynUnsafeCoerce :: HFunctor e' => EffectOrder -> (forall x. f x -> g x) -> e f a -> e' g a Source #

nil :: forall (f :: Type -> Type) a r. Union ('[] :: [Effect]) f a -> r Source #

nilMembership :: forall (e :: Effect) r. Membership e ('[] :: [Effect]) -> r Source #

weakensFor :: forall (es :: [Effect]) (es' :: [Effect]) (e :: Effect). Suffix es es' => Membership e es -> Membership e es' Source #

class Suffix (es :: [Effect]) (es' :: [Effect]) where Source #

Methods

prefixLen :: Int Source #

Instances

Instances details
Suffix es es Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

prefixLen :: Int Source #

Suffix es es' => Suffix es (e ': es') Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

prefixLen :: Int Source #

class SuffixUnder (es :: [Effect]) (es' :: [Effect]) where Source #

Instances

Instances details
Suffix es es' => SuffixUnder es es' Source # 
Instance details

Defined in Data.Effect.OpenUnion

SuffixUnder es es' => SuffixUnder (e ': es) (e ': es') Source # 
Instance details

Defined in Data.Effect.OpenUnion

weakensUnderFor :: forall (es :: [Effect]) (es' :: [Effect]) (e :: Effect). SuffixUnder es es' => Membership e es -> Membership e es' Source #

type family RemoveHOEs (es :: [Effect]) :: [Effect] where ... Source #

Equations

RemoveHOEs ('[] :: [Effect]) = '[] :: [Effect] 
RemoveHOEs (e ': es) = OrderCase (OrderOf e) (e ': RemoveHOEs es) (RemoveHOEs es) 

type WeakenHOEs (es :: [Effect]) = (WeakenHOEs_ es 0 (OrderOf (HeadOf es)), FOEs (RemoveHOEs es)) Source #

class orderOfHead ~ OrderOf (HeadOf es) => WeakenHOEs_ (es :: [Effect]) (countF :: Natural) (orderOfHead :: EffectOrder) where Source #

Methods

foldHoeIndexShifter :: (Int -> Int) -> Int -> Int Source #

Example for '[H,F,F,H,H,F,H,F]

ixordercountFshifter accumulation
0H001234... -> 12345...
1F001234... -> 12345...
2F101234... -> 12345...
3H201234... -> 12456...
4H201234... -> 12567...
5F201234... -> 12567...
6H301234... -> 12578...
7F301234... -> 12578...

Instances

Instances details
OrderOf (HeadOf ('[] :: [Effect])) ~ orderOfHead => WeakenHOEs_ ('[] :: [Effect]) countF orderOfHead Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

foldHoeIndexShifter :: (Int -> Int) -> Int -> Int Source #

(FirstOrder e, WeakenHOEs_ es (countF + 1) _orderOfHead) => WeakenHOEs_ (e ': es) countF 'FirstOrder Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

foldHoeIndexShifter :: (Int -> Int) -> Int -> Int Source #

(OrderOf e ~ 'HigherOrder, WeakenHOEs_ es countF _orderOfHead, KnownNat countF) => WeakenHOEs_ (e ': es) countF 'HigherOrder Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

foldHoeIndexShifter :: (Int -> Int) -> Int -> Int Source #

type family RemoveExps (es :: [Effect]) :: [Effect] where ... Source #

Equations

RemoveExps ('[] :: [Effect]) = '[] :: [Effect] 
RemoveExps (e ': es) = FormCase (FormOf e) (e ': RemoveExps es) (RemoveExps es) 

class formOfHead ~ FormOf (HeadOf es) => WeakenExps_ (es :: [Effect]) (countP :: Natural) (formOfHead :: EffectForm) where Source #

Methods

foldExpIndexShifter :: (Int -> Int) -> Int -> Int Source #

Instances

Instances details
FormOf (HeadOf ('[] :: [Effect])) ~ formOfHead => WeakenExps_ ('[] :: [Effect]) countP formOfHead Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

foldExpIndexShifter :: (Int -> Int) -> Int -> Int Source #

(FormOf e ~ 'Exponential, WeakenExps_ es countP _formOfHead, KnownNat countP) => WeakenExps_ (e ': es) countP 'Exponential Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

foldExpIndexShifter :: (Int -> Int) -> Int -> Int Source #

(PolyHFunctor e, WeakenExps_ es (countP + 1) _formOfHead) => WeakenExps_ (e ': es) countP 'Polynomial Source # 
Instance details

Defined in Data.Effect.OpenUnion

Methods

foldExpIndexShifter :: (Int -> Int) -> Int -> Int Source #

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

weakens :: forall (es :: [Effect]) (es' :: [Effect]) (f :: Type -> Type) a. Suffix es es' => Union es f a -> Union es' f a Source #

weakensUnder :: forall (es :: [Effect]) (es' :: [Effect]) (f :: Type -> Type) a. SuffixUnder es es' => Union es f a -> Union es' f a Source #

weakenHOEsFor :: forall (es :: [Effect]) (e :: Effect). WeakenHOEs es => Membership e (RemoveHOEs es) -> Membership e es Source #

weakenHOEs :: forall (es :: [Effect]) (f :: Type -> Type) a. WeakenHOEs es => Union (RemoveHOEs es) f a -> Union es f a Source #

weakenExpsFor :: forall (es :: [Effect]) (e :: Effect). WeakenExps es => Membership e (RemoveExps es) -> Membership e es Source #

weakenExps :: forall (es :: [Effect]) (f :: Type -> Type) a. WeakenExps es => Union (RemoveExps es) f a -> Union es f a Source #

class KnownLength (xs :: [k]) where Source #

Instances

Instances details
KnownLength ('[] :: [k]) Source # 
Instance details

Defined in Data.Effect.OpenUnion

KnownLength xs => KnownLength (x ': xs :: [k]) Source # 
Instance details

Defined in Data.Effect.OpenUnion

type family (es :: [Effect]) ++ (es' :: [Effect]) :: [Effect] where ... infixr 5 Source #

Equations

('[] :: [Effect]) ++ es = es 
(e ': es) ++ es' = e ': (es ++ es') 

(!++) :: forall (es :: [Effect]) (es' :: [Effect]) (f :: Type -> Type) a r. KnownLength es => (Union es f a -> r) -> (Union es' f a -> r) -> Union (es ++ es') f a -> r infixr 5 Source #

bundleUnion :: forall (es :: [Effect]) (es' :: [Effect]) (f :: Type -> Type) a. KnownLength es => Union (es ++ es') f a -> Union (Union es ': es') f a Source #

unbundleUnion :: forall (es :: [Effect]) (es' :: [(Type -> Type) -> Type -> Type]) (f :: Type -> Type) a. KnownLength es => Union (Union es ': es') f a -> Union (es ++ es') f a Source #

splitUnion :: forall (es :: [Effect]) (es' :: [Effect]) (es'' :: [Effect]) (f :: Type -> Type) a. KnownLength es => (forall (e :: Effect). Membership e es -> Membership e es'') -> (forall (e :: Effect). Membership e es' -> Membership e es'') -> Union (es ++ es') f a -> Union es'' f a Source #

mergeUnion :: forall (es :: [Effect]) (es' :: [Effect]) (f :: Type -> Type) a. KnownLength es => Either (Union es f a) (Union es' f a) -> Union (es ++ es') f a Source #

splitUnion1 :: forall {k} (fs :: [k -> Effect]) (x :: k) (es :: [Effect]) (es' :: [Effect]) (f :: Type -> Type) a. KnownLength fs => (forall (e :: Effect). Membership e (Each fs x) -> Membership e es') -> (forall (e :: Effect). Membership e es -> Membership e es') -> Union (Each fs x ++ es) f a -> Union es' f a Source #

mergeUnion1 :: forall {k} (fs :: [k -> Effect]) (x :: k) (es :: [Effect]) (f :: Type -> Type) a. KnownLength fs => Either (Union (Each fs x) f a) (Union es f a) -> Union (Each fs x ++ es) f a Source #

splitFor :: forall (es :: [Effect]) (es' :: [Effect]) (e :: Effect) r. KnownLength es => (Membership e es -> r) -> (Membership e es' -> r) -> Membership e (es ++ es') -> r Source #

splitFor1 :: forall {k} (fs :: [k -> Effect]) (x :: k) (es :: [Effect]) (e :: Effect) r. KnownLength fs => (Membership e (Each fs x) -> r) -> (Membership e es -> r) -> Membership e (Each fs x ++ es) -> r Source #

suffixFor :: forall (es' :: [Effect]) (es :: [Effect]) (e :: Effect). Membership e es -> Membership e (es ++ es') Source #

prefixFor :: forall (es' :: [Effect]) (es :: [Effect]) (e :: Effect). KnownLength es' => Membership e es -> Membership e (es' ++ es) Source #

type family Each (fs :: [k -> Effect]) (x :: k) :: [Effect] where ... Source #

Equations

Each (f ': fs :: [k -> Effect]) (x :: k) = f x ': Each fs x 
Each ('[] :: [k -> Effect]) (x :: k) = '[] :: [Effect] 

prefixFor1 :: forall {k} (fs :: [k -> Effect]) (x :: k) (es :: [Effect]) (e :: Effect). KnownLength fs => Membership e es -> Membership e (Each fs x ++ es) Source #

data Ordership (o :: EffectOrder) (e :: Effect) (f :: Type -> Type) (g :: Type -> Type) where Source #

Constructors

UnsafeFirst :: forall (e :: Effect) (f :: Type -> Type) (g :: Type -> Type). Ordership 'FirstOrder e f g 
UnsafeHigher :: forall (g :: Type -> Type) (f :: Type -> Type) (e :: Effect). (forall x. g x -> f x) -> Ordership 'HigherOrder e f g 

union :: forall (es :: [Effect]) (f :: Type -> Type) a r. (forall (e :: Effect) (o :: EffectOrder) (g :: Type -> Type). Membership e es -> Ordership o e f g -> e g a -> r) -> Union es f a -> r Source #

mkUnion :: forall e (es :: [Effect]) (o :: EffectOrder) (f :: Type -> Type) (g :: Type -> Type) a. Membership e es -> Ordership o e f g -> e g a -> Union es f a Source #

firstOrdership :: forall (e :: Effect) (f :: Type -> Type) (g :: Type -> Type). FirstOrder e => Ordership 'FirstOrder e f g Source #

higherOrdership :: forall (e :: Effect) g f. OrderOf e ~ 'HigherOrder => (forall x. g x -> f x) -> Ordership 'HigherOrder e f g Source #

shrinkOrdership :: forall (o :: EffectOrder) (e :: Effect) (f :: Type -> Type) (g :: Type -> Type). Ordership o e f g -> Ordership (OrderOf e) e f g Source #

continuationOfInterpretation :: forall (e :: Effect) f g. Ordership 'HigherOrder e f g -> forall x. g x -> f x Source #