data-effects-core-0.4.0.2: 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 HaskellSafe-Inferred
LanguageGHC2021

Data.Effect.OpenUnion

Description

 

Documentation

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

Constructors

UnsafeUnion 

Fields

  • :: !Int

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

  • -> e g a
     
  • -> !EffectOrder
     
  • -> (forall x. g x -> f x)
     
  • -> Union es f a
     

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 x. f x -> g x) -> Union es f a -> Union es g a Source #

class FOEs es Source #

Instances

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

Defined in Data.Effect.OpenUnion

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

Defined in Data.Effect.OpenUnion

coerceFOEs :: 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 :: Membership e (e ': es) Source #

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

weakenFor :: Membership e es -> Membership e (e' ': es) Source #

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

membershipAt :: forall i es. KnownNat i => Membership (At i es) es Source #

type family At i es where ... Source #

Equations

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

intVal :: forall n. 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

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 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 Has key e es = MemberBy KeyResolver (KeyDiscriminator key) (e # key) es Source #

type KnownIndex i es = (KnownNat i, KnownOrder (At i es)) Source #

type FindByLabel label e es = MemberBy LabelResolver label e es Source #

type MemberBy resolver dscr e es = (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 r | 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 es. FindBy resolver dscr (Discriminator resolver (HeadOf es)) e es => Membership e es Source #

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

keyMembership :: forall key e es. 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 where ... Source #

Equations

HeadOf (e ': es) = e 

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

class order ~ OrderOf e => Elem e order where Source #

Methods

inject :: Membership e es -> e f a -> Union es f a Source #

project :: Membership e es -> Union es f a -> Maybe (e f a) Source #

(!:) :: (e f a -> r) -> (Union es f a -> r) -> Union (e ': es) f a -> r infixr 5 Source #

extract :: 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 :: (KnownOrder e, HFunctor e) => Union (e ': es) f a -> Either (e f a) (Union es f a) Source #

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

caseAnyOrder :: HFunctor e => (e f a -> r) -> (Union es f a -> r) -> Union (e ': es) f a -> r infixr 5 Source #

extractAnyOrder :: 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 :: Union '[] f a -> r Source #

weakensFor :: forall es es' e. 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 es' e. SuffixUnder es es' => Membership e es -> Membership e es' Source #

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

Equations

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

type WeakenHOEs es = (WeakenHOEs_ es 0 (OrderOf (HeadOf es)), FOEs (RemoveHOEs es)) Source #

class orderOfHead ~ OrderOf (HeadOf es) => WeakenHOEs_ es (countF :: Natural) orderOfHead 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 #

weaken :: Union es f a -> Union (e ': es) f a Source #

weakens :: Suffix es es' => Union es f a -> Union es' f a Source #

weakensUnder :: SuffixUnder es es' => Union es f a -> Union es' f a Source #

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

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

class KnownLength xs 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]) where ... infixr 5 Source #

Equations

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

(!++) :: forall es es' f 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 es' f a. KnownLength es => Union (es ++ es') f a -> Union (Union es ': es') f a Source #

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

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

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

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

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

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

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

Equations

Each (f ': fs) x = f x ': Each fs x 
Each '[] x = '[] 

prefixFor1 :: forall fs x es e. 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 :: Ordership 'FirstOrder e f g 
UnsafeHigher :: (forall x. g x -> f x) -> Ordership 'HigherOrder e f g 

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

mkUnion :: Membership e es -> Ordership o e f g -> e g a -> Union es f a Source #

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

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