heftia-0.2.0.0: higher-order effects done right
Copyright(c) 2023-2024 Yamada Ryo
LicenseMPL-2.0 (see the file LICENSE)
Maintainerymdfield@outlook.jp
Stabilityexperimental
Portabilityportable
Safe HaskellSafe-Inferred
LanguageGHC2021

Data.Hefty.Union

Description

A type class representing a general open union for higher-order effects, independent of the internal implementation.

Synopsis

Documentation

class Union (u :: [SigClass] -> SigClass) where Source #

A type class representing a general open union for higher-order effects, independent of the internal implementation.

Minimal complete definition

inject, project, exhaust, (comp | inject0, weaken, decomp | (|+:))

Associated Types

type HasMembership u (e :: SigClass) (es :: [SigClass]) :: Constraint Source #

Methods

inject :: HasMembership u e es => e f ~> u es f Source #

project :: HasMembership u e es => u es f a -> Maybe (e f a) Source #

exhaust :: u '[] f a -> x Source #

comp :: Either (e f a) (u es f a) -> u (e ': es) f a Source #

decomp :: u (e ': es) f a -> (e :+: u es) f a Source #

(|+:) :: (e f a -> r) -> (u es f a -> r) -> u (e ': es) f a -> r infixr 5 Source #

inject0 :: e f ~> u (e ': es) f Source #

injectUnder :: h2 f ~> u (h1 ': (h2 ': es)) f Source #

injectUnder2 :: h3 f ~> u (h1 ': (h2 ': (h3 ': es))) f Source #

injectUnder3 :: h4 f ~> u (h1 ': (h2 ': (h3 ': (h4 ': es)))) f Source #

weaken :: u es f ~> u (e ': es) f Source #

weaken2 :: u es f ~> u (e1 ': (e2 ': es)) f Source #

weaken3 :: u es f ~> u (e1 ': (e2 ': (e3 ': es))) f Source #

weaken4 :: u es f ~> u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

weakenUnder :: u (e1 ': es) f ~> u (e1 ': (e2 ': es)) f Source #

weakenUnder2 :: u (e1 ': (e2 ': es)) f ~> u (e1 ': (e2 ': (e3 ': es))) f Source #

weakenUnder3 :: u (e1 ': (e2 ': (e3 ': es))) f ~> u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

weaken2Under :: u (e1 ': es) f ~> u (e1 ': (e2 ': (e3 ': es))) f Source #

weaken2Under2 :: u (e1 ': (e2 ': es)) f ~> u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

weaken3Under :: u (e1 ': es) f ~> u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

flipUnion :: u (e1 ': (e2 ': es)) f ~> u (e2 ': (e1 ': es)) f Source #

flipUnion3 :: u (e1 ': (e2 ': (e3 ': es))) f ~> u (e3 ': (e2 ': (e1 ': es))) f Source #

flipUnionUnder :: u (e1 ': (e2 ': (e3 ': es))) f ~> u (e1 ': (e3 ': (e2 ': es))) f Source #

rot3 :: u (e1 ': (e2 ': (e3 ': es))) f ~> u (e2 ': (e3 ': (e1 ': es))) f Source #

rot3' :: u (e1 ': (e2 ': (e3 ': es))) f ~> u (e3 ': (e1 ': (e2 ': es))) f Source #

bundleUnion2 :: u (e1 ': (e2 ': es)) f ~> u (u '[e1, e2] ': es) f Source #

bundleUnion3 :: u (e1 ': (e2 ': (e3 ': es))) f ~> u (u '[e1, e2, e3] ': es) f Source #

bundleUnion4 :: u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f ~> u (u '[e1, e2, e3, e4] ': es) f Source #

unbundleUnion2 :: u (u '[e1, e2] ': es) f ~> u (e1 ': (e2 ': es)) f Source #

unbundleUnion3 :: u (u '[e1, e2, e3] ': es) f ~> u (e1 ': (e2 ': (e3 ': es))) f Source #

unbundleUnion4 :: u (u '[e1, e2, e3, e4] ': es) f ~> u (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

Instances

Instances details
Union ExtensibleUnion Source # 
Instance details

Defined in Data.Hefty.Extensible

Associated Types

type HasMembership ExtensibleUnion e es Source #

Methods

inject :: forall (e :: SigClass) (es :: [SigClass]) (f :: Type -> Type). HasMembership ExtensibleUnion e es => e f ~> ExtensibleUnion es f Source #

project :: forall e (es :: [SigClass]) (f :: Type -> Type) a. HasMembership ExtensibleUnion e es => ExtensibleUnion es f a -> Maybe (e f a) Source #

exhaust :: forall (f :: Type -> Type) a x. ExtensibleUnion '[] f a -> x Source #

comp :: forall e (f :: Type -> Type) a (es :: [SigClass]). Either (e f a) (ExtensibleUnion es f a) -> ExtensibleUnion (e ': es) f a Source #

decomp :: forall (e :: SigClass) (es :: [SigClass]) (f :: Type -> Type) a. ExtensibleUnion (e ': es) f a -> (e :+: ExtensibleUnion es) f a Source #

(|+:) :: forall e (f :: Type -> Type) a r (es :: [SigClass]). (e f a -> r) -> (ExtensibleUnion es f a -> r) -> ExtensibleUnion (e ': es) f a -> r Source #

inject0 :: forall (e :: (Type -> Type) -> Type -> Type) (f :: Type -> Type) (es :: [(Type -> Type) -> Type -> Type]). e f ~> ExtensibleUnion (e ': es) f Source #

injectUnder :: forall (h2 :: (Type -> Type) -> Type -> Type) (f :: Type -> Type) (h1 :: (Type -> Type) -> Type -> Type) (es :: [(Type -> Type) -> Type -> Type]). h2 f ~> ExtensibleUnion (h1 ': (h2 ': es)) f Source #

injectUnder2 :: forall (h3 :: (Type -> Type) -> Type -> Type) (f :: Type -> Type) (h1 :: (Type -> Type) -> Type -> Type) (h2 :: (Type -> Type) -> Type -> Type) (es :: [(Type -> Type) -> Type -> Type]). h3 f ~> ExtensibleUnion (h1 ': (h2 ': (h3 ': es))) f Source #

injectUnder3 :: forall (h4 :: (Type -> Type) -> Type -> Type) (f :: Type -> Type) (h1 :: (Type -> Type) -> Type -> Type) (h2 :: (Type -> Type) -> Type -> Type) (h3 :: (Type -> Type) -> Type -> Type) (es :: [(Type -> Type) -> Type -> Type]). h4 f ~> ExtensibleUnion (h1 ': (h2 ': (h3 ': (h4 ': es)))) f Source #

weaken :: forall (es :: [SigClass]) (f :: Type -> Type) (e :: SigClass). ExtensibleUnion es f ~> ExtensibleUnion (e ': es) f Source #

weaken2 :: forall (es :: [SigClass]) (f :: Type -> Type) (e1 :: SigClass) (e2 :: SigClass). ExtensibleUnion es f ~> ExtensibleUnion (e1 ': (e2 ': es)) f Source #

weaken3 :: forall (es :: [SigClass]) (f :: Type -> Type) (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass). ExtensibleUnion es f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f Source #

weaken4 :: forall (es :: [SigClass]) (f :: Type -> Type) (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (e4 :: SigClass). ExtensibleUnion es f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

weakenUnder :: forall (e1 :: SigClass) (es :: [SigClass]) (f :: Type -> Type) (e2 :: SigClass). ExtensibleUnion (e1 ': es) f ~> ExtensibleUnion (e1 ': (e2 ': es)) f Source #

weakenUnder2 :: forall (e1 :: SigClass) (e2 :: SigClass) (es :: [SigClass]) (f :: Type -> Type) (e3 :: SigClass). ExtensibleUnion (e1 ': (e2 ': es)) f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f Source #

weakenUnder3 :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (es :: [SigClass]) (f :: Type -> Type) (e4 :: SigClass). ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

weaken2Under :: forall (e1 :: SigClass) (es :: [SigClass]) (f :: Type -> Type) (e2 :: SigClass) (e3 :: SigClass). ExtensibleUnion (e1 ': es) f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f Source #

weaken2Under2 :: forall (e1 :: SigClass) (e2 :: SigClass) (es :: [SigClass]) (f :: Type -> Type) (e3 :: SigClass) (e4 :: SigClass). ExtensibleUnion (e1 ': (e2 ': es)) f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

weaken3Under :: forall (e1 :: SigClass) (es :: [SigClass]) (f :: Type -> Type) (e2 :: SigClass) (e3 :: SigClass) (e4 :: SigClass). ExtensibleUnion (e1 ': es) f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

flipUnion :: forall (e1 :: SigClass) (e2 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': es)) f ~> ExtensibleUnion (e2 ': (e1 ': es)) f Source #

flipUnion3 :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f ~> ExtensibleUnion (e3 ': (e2 ': (e1 ': es))) f Source #

flipUnionUnder :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f ~> ExtensibleUnion (e1 ': (e3 ': (e2 ': es))) f Source #

rot3 :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f ~> ExtensibleUnion (e2 ': (e3 ': (e1 ': es))) f Source #

rot3' :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f ~> ExtensibleUnion (e3 ': (e1 ': (e2 ': es))) f Source #

bundleUnion2 :: forall (e1 :: SigClass) (e2 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': es)) f ~> ExtensibleUnion (ExtensibleUnion '[e1, e2] ': es) f Source #

bundleUnion3 :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f ~> ExtensibleUnion (ExtensibleUnion '[e1, e2, e3] ': es) f Source #

bundleUnion4 :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (e4 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (e1 ': (e2 ': (e3 ': (e4 ': es)))) f ~> ExtensibleUnion (ExtensibleUnion '[e1, e2, e3, e4] ': es) f Source #

unbundleUnion2 :: forall (e1 :: SigClass) (e2 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (ExtensibleUnion '[e1, e2] ': es) f ~> ExtensibleUnion (e1 ': (e2 ': es)) f Source #

unbundleUnion3 :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (ExtensibleUnion '[e1, e2, e3] ': es) f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': es))) f Source #

unbundleUnion4 :: forall (e1 :: SigClass) (e2 :: SigClass) (e3 :: SigClass) (e4 :: SigClass) (es :: [SigClass]) (f :: Type -> Type). ExtensibleUnion (ExtensibleUnion '[e1, e2, e3, e4] ': es) f ~> ExtensibleUnion (e1 ': (e2 ': (e3 ': (e4 ': es)))) f Source #

class (Union u, forall e es. (HFunctor e, forallHFunctor es) => forallHFunctor (e ': es), forall es. forallHFunctor es => HFunctor (u es), forallHFunctor ~ ForallHFunctor u, forallHFunctor '[]) => HFunctorUnion_ forallHFunctor u | u -> forallHFunctor Source #

Associated Types

type ForallHFunctor u :: [SigClass] -> Constraint Source #

Instances

Instances details
HFunctorUnion_ (Forall HFunctor) ExtensibleUnion Source # 
Instance details

Defined in Data.Hefty.Extensible

data FoundLevel Source #

Constructors

CurrentLevel 
LowerLevel 

Instances

Instances details
SingKind FoundLevel Source # 
Instance details

Defined in Data.Hefty.Union

Associated Types

type Demote FoundLevel = (r :: Type) #

SingI 'CurrentLevel Source # 
Instance details

Defined in Data.Hefty.Union

Methods

sing :: Sing 'CurrentLevel #

SingI 'LowerLevel Source # 
Instance details

Defined in Data.Hefty.Union

Methods

sing :: Sing 'LowerLevel #

SingI1 'FoundIn Source # 
Instance details

Defined in Data.Hefty.Union

Methods

liftSing :: forall (x :: k1). Sing x -> Sing ('FoundIn x) #

SingI FoundInSym0 Source # 
Instance details

Defined in Data.Hefty.Union

SuppressUnusedWarnings FoundInSym0 Source # 
Instance details

Defined in Data.Hefty.Union

type Demote FoundLevel Source # 
Instance details

Defined in Data.Hefty.Union

type Sing Source # 
Instance details

Defined in Data.Hefty.Union

type Apply FoundInSym0 (a6989586621679104905 :: FoundLevel) Source # 
Instance details

Defined in Data.Hefty.Union

type Apply FoundInSym0 (a6989586621679104905 :: FoundLevel) = 'FoundIn a6989586621679104905

data SearchResult Source #

Constructors

FoundIn FoundLevel 
NotFound 

Instances

Instances details
SingKind SearchResult Source # 
Instance details

Defined in Data.Hefty.Union

Associated Types

type Demote SearchResult = (r :: Type) #

SingI 'NotFound Source # 
Instance details

Defined in Data.Hefty.Union

Methods

sing :: Sing 'NotFound #

SingI1 'FoundIn Source # 
Instance details

Defined in Data.Hefty.Union

Methods

liftSing :: forall (x :: k1). Sing x -> Sing ('FoundIn x) #

SingI n => SingI ('FoundIn n :: SearchResult) Source # 
Instance details

Defined in Data.Hefty.Union

Methods

sing :: Sing ('FoundIn n) #

SingI FoundInSym0 Source # 
Instance details

Defined in Data.Hefty.Union

SuppressUnusedWarnings FoundInSym0 Source # 
Instance details

Defined in Data.Hefty.Union

type Demote SearchResult Source # 
Instance details

Defined in Data.Hefty.Union

type Sing Source # 
Instance details

Defined in Data.Hefty.Union

type Apply FoundInSym0 (a6989586621679104905 :: FoundLevel) Source # 
Instance details

Defined in Data.Hefty.Union

type Apply FoundInSym0 (a6989586621679104905 :: FoundLevel) = 'FoundIn a6989586621679104905

type family FoundInSym1 (a6989586621679104905 :: FoundLevel) :: SearchResult where ... Source #

Equations

FoundInSym1 a6989586621679104905 = FoundIn a6989586621679104905 

data FoundInSym0 :: (~>) FoundLevel SearchResult where Source #

Constructors

FoundInSym0KindInference :: SameKind (Apply FoundInSym0 arg) (FoundInSym1 arg) => FoundInSym0 a6989586621679104905 

Instances

Instances details
SingI FoundInSym0 Source # 
Instance details

Defined in Data.Hefty.Union

SuppressUnusedWarnings FoundInSym0 Source # 
Instance details

Defined in Data.Hefty.Union

type Apply FoundInSym0 (a6989586621679104905 :: FoundLevel) Source # 
Instance details

Defined in Data.Hefty.Union

type Apply FoundInSym0 (a6989586621679104905 :: FoundLevel) = 'FoundIn a6989586621679104905

type family NotFoundSym0 :: SearchResult where ... Source #

Equations

NotFoundSym0 = NotFound 

type family CurrentLevelSym0 :: FoundLevel where ... Source #

type family LowerLevelSym0 :: FoundLevel where ... Source #

type family FoundLevelOf found :: FoundLevel where ... Source #

Equations

FoundLevelOf ('FoundIn l) = l 

type MemberH u e ehs = HasMembershipRec u e ehs Source #

type Member u e efs = MemberH u (LiftIns e) efs Source #

class MemberRec (u :: [SigClass] -> SigClass) e es where Source #

Methods

injectRec :: e f ~> u es f Source #

projectRec :: u es f a -> Maybe (e f a) Source #

Instances

Instances details
(SearchMemberRec es u e es, MemberFound e es (CurrentLevelSearchResult searchResult), searchResult ~ Search u es e, SingI (HeadLowerSearchResult searchResult), found ~ CurrentLevelSearchResult searchResult) => MemberRec u e es Source # 
Instance details

Defined in Data.Hefty.Union

Methods

injectRec :: forall (f :: Type -> Type). e f ~> u es f Source #

projectRec :: forall (f :: Type -> Type) a. u es f a -> Maybe (e f a) Source #

type HasMembershipRec u e es = (SearchMemberRec es u e es, HasMembershipRec1_ u e es (Search u es e)) Source #

type HasMembershipRec1_ u e es searchResult = (HasMembershipRec2_ u e es (CurrentLevelSearchResult searchResult), SingI (HeadLowerSearchResult searchResult)) Source #

type HasMembershipRec2_ u e es found = HasMembershipRec3_ u e es found (FoundLevelOf found) Source #

type HasMembershipRec3_ u e es found lvl = (found ~ 'FoundIn lvl, SingI lvl, HasMembershipWhenCurrentLevel lvl u e es, SearchMemberRecWhenLowerLevel lvl es u e) Source #

class MemberFound e es found where Source #

Methods

withFound :: (forall lvl. (found ~ 'FoundIn lvl, SingI lvl) => a) -> a Source #

Instances

Instances details
(TypeError ((('Text "The effect class: " :<>: 'ShowType e) :$$: 'Text " was not found in the union:") :$$: ('Text " " :<>: 'ShowType es)) :: Constraint) => MemberFound (e :: k1) (es :: k2) 'NotFound Source # 
Instance details

Defined in Data.Hefty.Union

Methods

withFound :: (forall (lvl :: FoundLevel). ('NotFound ~ 'FoundIn lvl, SingI lvl) => a) -> a Source #

SingI lvl => MemberFound (e :: k1) (es :: k2) ('FoundIn lvl) Source # 
Instance details

Defined in Data.Hefty.Union

Methods

withFound :: (forall (lvl0 :: FoundLevel). ('FoundIn lvl ~ 'FoundIn lvl0, SingI lvl0) => a) -> a Source #

class SearchMemberRec_ (act :: SearchMemberRecAction) (rest :: [SigClass]) (u :: [SigClass] -> SigClass) (e :: SigClass) (es :: [SigClass]) where Source #

Associated Types

type Search_ act u rest e :: SearchResults Source #

Methods

injectSMR_ :: searchResult ~ Search_ act u rest e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> e f ~> u es f Source #

projectSMR_ :: searchResult ~ Search_ act u rest e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> u es f a -> Maybe (e f a) Source #

Instances

Instances details
SearchMemberRec_ act ('[] :: [SigClass]) u e es Source # 
Instance details

Defined in Data.Hefty.Union

Associated Types

type Search_ act u '[] e :: SearchResults Source #

Methods

injectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type). searchResult ~ Search_ act u '[] e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> e f ~> u es f Source #

projectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type) a. searchResult ~ Search_ act u '[] e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> u es f a -> Maybe (e f a) Source #

(SearchMemberRec es' u e es', headSearchResults ~ Search u es' e, tailSearchResults ~ Search u tail e, isFoundInHead ~ IsFound (CurrentLevelSearchResult headSearchResults), If isFoundInHead (HasMembership u (u es') es) (), SearchMemberRec (If isFoundInHead ('[] :: [SigClass]) tail) u e es, Union u, SingI (HeadLowerSearchResult headSearchResults), SingI (HeadLowerSearchResult tailSearchResults)) => SearchMemberRec_ 'SmrDown (u es' ': tail) u e es Source # 
Instance details

Defined in Data.Hefty.Union

Associated Types

type Search_ 'SmrDown u (u es' ': tail) e :: SearchResults Source #

Methods

injectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type). searchResult ~ Search_ 'SmrDown u (u es' ': tail) e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> e f ~> u es f Source #

projectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type) a. searchResult ~ Search_ 'SmrDown u (u es' ': tail) e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> u es f a -> Maybe (e f a) Source #

(HasMembership u e es, Union u) => SearchMemberRec_ 'SmrStop (e ': _tail) u e es Source # 
Instance details

Defined in Data.Hefty.Union

Associated Types

type Search_ 'SmrStop u (e ': _tail) e :: SearchResults Source #

Methods

injectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type). searchResult ~ Search_ 'SmrStop u (e ': _tail) e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> e f ~> u es f Source #

projectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type) a. searchResult ~ Search_ 'SmrStop u (e ': _tail) e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> u es f a -> Maybe (e f a) Source #

(HasMembershipWhenCurrentLevel lvl u e (_e ': rest), SearchMemberRecWhenLowerLevel lvl rest u e, SingI (HeadLowerSearchResult searchResult), Union u, searchResult ~ Search u rest e, lvl ~ FoundLevelOf (CurrentLevelSearchResult searchResult)) => SearchMemberRec_ 'SmrRight (_e ': rest) u e (_e ': rest) Source # 
Instance details

Defined in Data.Hefty.Union

Associated Types

type Search_ 'SmrRight u (_e ': rest) e :: SearchResults Source #

Methods

injectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type). searchResult ~ Search_ 'SmrRight u (_e ': rest) e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> e f ~> u (_e ': rest) f Source #

projectSMR_ :: forall (searchResult :: SearchResults) (lvl :: FoundLevel) (f :: Type -> Type) a. searchResult ~ Search_ 'SmrRight u (_e ': rest) e => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> u (_e ': rest) f a -> Maybe (e f a) Source #

type Search u rest e = Search_ (NextSearchMemberRecAction rest u e) u rest e Source #

injectSMR :: forall rest u e es searchResult lvl f. (SearchMemberRec rest u e es, searchResult ~ Search u rest e) => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> e f ~> u es f Source #

projectSMR :: forall rest u e es searchResult lvl f a. (SearchMemberRec rest u e es, searchResult ~ Search u rest e) => (CurrentLevelSearchResult searchResult :~: 'FoundIn lvl) -> SSearchResult ('FoundIn lvl) -> SSearchResult (HeadLowerSearchResult searchResult) -> u es f a -> Maybe (e f a) Source #

type family CurrentLevelSearchResult a where ... Source #

type family HeadLowerSearchResult a where ... Source #

Equations

HeadLowerSearchResult ('SearchResults _ a) = a 

type family NextSearchMemberRecAction rest (u :: [SigClass] -> SigClass) e where ... Source #

type family IsFound found where ... Source #

Equations

IsFound ('FoundIn _) = 'True 
IsFound 'NotFound = 'False 

type SearchResultsOnSmrDown u es' tail e foundInHead foundInTail = 'SearchResults (If (IsFound foundInHead) ('FoundIn 'LowerLevel) foundInTail) foundInHead Source #

class (lvl ~ 'CurrentLevel => c, c ~ HasMembership u e es) => HasMembershipWhenCurrentLevel_ c lvl u e es | u e es -> c Source #

Instances

Instances details
(lvl ~ 'CurrentLevel => c, c ~ HasMembership u e es) => HasMembershipWhenCurrentLevel_ c lvl u e es Source # 
Instance details

Defined in Data.Hefty.Union

class (lvl ~ 'LowerLevel => c, c ~ SearchMemberRec rest u e rest) => SearchMemberRecWhenLowerLevel_ c lvl rest u e | rest u e -> c Source #

Instances

Instances details
(lvl ~ 'LowerLevel => c, c ~ SearchMemberRec rest u e rest) => SearchMemberRecWhenLowerLevel_ c lvl rest u e Source # 
Instance details

Defined in Data.Hefty.Union

(|+) :: Union u => (e a -> r) -> (u es f a -> r) -> u (LiftIns e ': es) f a -> r infixr 5 Source #

type U u ef = UH u (LiftIns ef) Source #

Recursively decompose the sum of first-order effects into a list, following the direction of right association, with normalization.

type UH u eh = SumToUnionList u (NormalizeSig eh) Source #

Recursively decompose the sum of higher-order effects into a list, following the direction of right association, with normalization.

type family SumToUnionList (u :: [SigClass] -> SigClass) (e :: SigClass) :: [SigClass] where ... Source #

Recursively decompose the sum of higher-order effects into a list, following the direction of right association.

Equations

SumToUnionList u (e1 :+: e2) = MultiListToUnion u (SumToUnionList u e1) ': SumToUnionList u e2 
SumToUnionList u LNop = '[] 
SumToUnionList u (SingleSig e) = '[e] 

type family MultiListToUnion (u :: [SigClass] -> SigClass) (es :: [SigClass]) :: SigClass where ... Source #

Convert a given list of higher-order effect classes into a suitable representation type for each case of being empty, single, or multiple.

Equations

MultiListToUnion u '[] = LNop 
MultiListToUnion u '[e] = e 
MultiListToUnion u es = u es 

type family NormalizeSig e where ... Source #

Normalization in preparation for decomposing the sum of effect classes into a list.

In particular, mark an indivisible, single effect class by applying the SingleSig wrapper to it.

newtype SingleSig (e :: SigClass) f a Source #

A wrapper to mark a single, i.e., a higher-order effect class that cannot be further decomposed as a sum.

Constructors

SingleSig 

Fields

Instances

Instances details
HFunctor e => HFunctor (SingleSig e) Source # 
Instance details

Defined in Data.Hefty.Union

Methods

hfmap :: forall (f :: Type -> Type) (g :: Type -> Type). (f :-> g) -> SingleSig e f :-> SingleSig e g #

type family UnionListToSum (u :: [SigClass] -> SigClass) (es :: [SigClass]) :: SigClass where ... Source #

Equations

UnionListToSum u '[e] = UnionToSum u e 
UnionListToSum u '[] = LNop 
UnionListToSum u (e ': r) = UnionToSum u e :+: UnionListToSum u r 

type family UnionToSum (u :: [SigClass] -> SigClass) (e :: SigClass) :: SigClass where ... Source #

Equations

UnionToSum u (u es) = UnionListToSum u es 
UnionToSum u e = e 

type S u es = UnionListToSum u es Nop Source #

type SH u es = UnionListToSum u es Source #

type NormalFormUnionList u es = U u (S u es) ~ es Source #

type NormalFormUnionListH u es = UH u (SH u es) ~ es Source #

type NFU u es = NormalFormUnionList u es Source #

type family UnliftIfSingle e where ... Source #

Equations

UnliftIfSingle (LiftIns e) = e 
UnliftIfSingle e = e Nop 

class LiftInsIfSingle e le where Source #

Instances

Instances details
LiftInsIfSingle e (LiftIns e) Source # 
Instance details

Defined in Data.Hefty.Union

LiftInsIfSingle (e Nop) e Source # 
Instance details

Defined in Data.Hefty.Union

type family ClassIndex (es :: [SigClass]) (e :: SigClass) :: Nat where ... Source #

Equations

ClassIndex (e ': es) e = 0 
ClassIndex (_ ': es) e = 1 + ClassIndex es e 
ClassIndex '[] e = TypeError (('Text "The effect class \8216" :<>: 'ShowType e) :<>: 'Text "\8217 was not found in the list.") 

type MemberBy u key e efs = (Member u (key #> e) efs, Lookup key efs ~ 'Just (LiftIns (key #> e))) Source #

type MemberHBy u key e ehs = (MemberH u (key ##> e) ehs, Lookup key ehs ~ 'Just (key ##> e)) Source #

type family Lookup (key :: k) es :: Maybe SigClass where ... Source #

Equations

Lookup key ((key ##> e) ': _) = 'Just (key ##> e) 
Lookup key (LiftIns (key #> e) ': _) = 'Just (LiftIns (key #> e)) 
Lookup key (u es ': es') = Lookup key es `OrElse` Lookup key es' 
Lookup key (_ ': es) = Lookup key es 
Lookup key '[] = 'Nothing 

type family OrElse (a :: Maybe k) (b :: Maybe k) :: Maybe k where ... Source #

Equations

OrElse ('Just a) _ = 'Just a 
OrElse 'Nothing a = a