symantic-base-0.5.0.20221211: Basic symantic combinators for Embedded Domain-Specific Languages (EDSL)
Safe HaskellSafe-Inferred
LanguageHaskell2010

Symantic.Syntaxes.Derive

Synopsis

Type Semantic

type Semantic = Type -> Type Source #

The kind of sem(antics) throughout this library.

Type family Derived

type family Derived (sem :: Semantic) :: Semantic Source #

The next Semantic that (sem) derives to.

Instances

Instances details
type Derived Viewer Source #

Unusual, but enables to leverage default definition of methods.

Instance details

Defined in Symantic.Semantics.Viewer

type Derived (SomeData sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

type Derived (SomeData sem) = sem
type Derived (Reader r sem) Source # 
Instance details

Defined in Symantic.Semantics.Reader

type Derived (Reader r sem) = sem
type Derived (SharingFinalizer _letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

type Derived (SharingFinalizer _letName sem) = sem
type Derived (SharingObserver letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

type Derived (SharingObserver letName sem) = SharingFinalizer letName sem
type Derived (Data able sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

type Derived (Data able sem) = sem

Class Derivable

class Derivable sem where Source #

Derive an interpreter to another interpreter determined by the Derived open type family. This is mostly useful when running the interpreter stack, but also when going back from an initial encoding to a final one.

Note that derive and liftDerived are not necessarily reciprocical functions.

Methods

derive :: sem a -> Derived sem a Source #

Instances

Instances details
Derivable (SomeData sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: SomeData sem a -> Derived (SomeData sem) a Source #

Abstractable sem => Derivable (Data Abstractable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Anythingable sem => Derivable (Data Anythingable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Bottomable sem => Derivable (Data Bottomable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: Data Bottomable sem a -> Derived (Data Bottomable sem) a Source #

Constantable c sem => Derivable (Data (Constantable c) sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: Data (Constantable c) sem a -> Derived (Data (Constantable c) sem) a Source #

Eitherable sem => Derivable (Data Eitherable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: Data Eitherable sem a -> Derived (Data Eitherable sem) a Source #

Emptyable sem => Derivable (Data Emptyable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: Data Emptyable sem a -> Derived (Data Emptyable sem) a Source #

Equalable sem => Derivable (Data Equalable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: Data Equalable sem a -> Derived (Data Equalable sem) a Source #

IfThenElseable sem => Derivable (Data IfThenElseable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Listable sem => Derivable (Data Listable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: Data Listable sem a -> Derived (Data Listable sem) a Source #

Maybeable sem => Derivable (Data Maybeable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Methods

derive :: Data Maybeable sem a -> Derived (Data Maybeable sem) a Source #

Semigroupable sem => Derivable (Data Semigroupable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Unabstractable sem => Derivable (Data Unabstractable sem) Source # 
Instance details

Defined in Symantic.Syntaxes.Data

Class LiftDerived

class LiftDerived sem where Source #

Lift the Derived interpreter of an interpreter, to that interpreter. This is mostly useful to give default values to class methods in order to skip their definition for interpreters where liftDerived can already apply the right semantic.

Note that derive and liftDerived are not necessarily reciprocical functions.

Methods

liftDerived :: Derived sem a -> sem a Source #

Instances

Instances details
LiftDerived Viewer Source # 
Instance details

Defined in Symantic.Semantics.Viewer

LiftDerived (Reader r sem) Source # 
Instance details

Defined in Symantic.Semantics.Reader

Methods

liftDerived :: Derived (Reader r sem) a -> Reader r sem a Source #

(Eq letName, Hashable letName) => LiftDerived (SharingFinalizer letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived :: Derived (SharingFinalizer letName sem) a -> SharingFinalizer letName sem a Source #

(Referenceable letName sem, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived (SharingObserver letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived :: Derived (SharingObserver letName sem) a -> SharingObserver letName sem a Source #

Class LiftDerived1

class LiftDerived1 sem where Source #

Convenient wrapper of derive and liftDerived for functions with a single argument.

Minimal complete definition

Nothing

Methods

liftDerived1 :: (Derived sem a -> Derived sem b) -> sem a -> sem b Source #

default liftDerived1 :: LiftDerived sem => Derivable sem => (Derived sem a -> Derived sem b) -> sem a -> sem b Source #

Instances

Instances details
LiftDerived1 (Reader r sem) Source # 
Instance details

Defined in Symantic.Semantics.Reader

Methods

liftDerived1 :: (Derived (Reader r sem) a -> Derived (Reader r sem) b) -> Reader r sem a -> Reader r sem b Source #

(Eq letName, Hashable letName) => LiftDerived1 (SharingFinalizer letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived1 :: (Derived (SharingFinalizer letName sem) a -> Derived (SharingFinalizer letName sem) b) -> SharingFinalizer letName sem a -> SharingFinalizer letName sem b Source #

(Referenceable letName sem, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived1 (SharingObserver letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived1 :: (Derived (SharingObserver letName sem) a -> Derived (SharingObserver letName sem) b) -> SharingObserver letName sem a -> SharingObserver letName sem b Source #

Class LiftDerived2

class LiftDerived2 sem where Source #

Convenient wrapper of derive and liftDerived for functions with two arguments. Note that the default instance relies upon LiftDerived, not LiftDerived1.

Minimal complete definition

Nothing

Methods

liftDerived2 :: (Derived sem a -> Derived sem b -> Derived sem c) -> sem a -> sem b -> sem c Source #

default liftDerived2 :: LiftDerived sem => Derivable sem => (Derived sem a -> Derived sem b -> Derived sem c) -> sem a -> sem b -> sem c Source #

Instances

Instances details
LiftDerived2 (Reader r sem) Source # 
Instance details

Defined in Symantic.Semantics.Reader

Methods

liftDerived2 :: (Derived (Reader r sem) a -> Derived (Reader r sem) b -> Derived (Reader r sem) c) -> Reader r sem a -> Reader r sem b -> Reader r sem c Source #

(Eq letName, Hashable letName) => LiftDerived2 (SharingFinalizer letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived2 :: (Derived (SharingFinalizer letName sem) a -> Derived (SharingFinalizer letName sem) b -> Derived (SharingFinalizer letName sem) c) -> SharingFinalizer letName sem a -> SharingFinalizer letName sem b -> SharingFinalizer letName sem c Source #

(Referenceable letName sem, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived2 (SharingObserver letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived2 :: (Derived (SharingObserver letName sem) a -> Derived (SharingObserver letName sem) b -> Derived (SharingObserver letName sem) c) -> SharingObserver letName sem a -> SharingObserver letName sem b -> SharingObserver letName sem c Source #

Class LiftDerived3

class LiftDerived3 sem where Source #

Convenient wrapper of derive and liftDerived for functions with three arguments. Note that the default instance relies upon LiftDerived, not LiftDerived2.

Minimal complete definition

Nothing

Methods

liftDerived3 :: (Derived sem a -> Derived sem b -> Derived sem c -> Derived sem d) -> sem a -> sem b -> sem c -> sem d Source #

default liftDerived3 :: LiftDerived sem => Derivable sem => (Derived sem a -> Derived sem b -> Derived sem c -> Derived sem d) -> sem a -> sem b -> sem c -> sem d Source #

Instances

Instances details
LiftDerived3 (Reader r sem) Source # 
Instance details

Defined in Symantic.Semantics.Reader

Methods

liftDerived3 :: (Derived (Reader r sem) a -> Derived (Reader r sem) b -> Derived (Reader r sem) c -> Derived (Reader r sem) d) -> Reader r sem a -> Reader r sem b -> Reader r sem c -> Reader r sem d Source #

(Eq letName, Hashable letName) => LiftDerived3 (SharingFinalizer letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived3 :: (Derived (SharingFinalizer letName sem) a -> Derived (SharingFinalizer letName sem) b -> Derived (SharingFinalizer letName sem) c -> Derived (SharingFinalizer letName sem) d) -> SharingFinalizer letName sem a -> SharingFinalizer letName sem b -> SharingFinalizer letName sem c -> SharingFinalizer letName sem d Source #

(Referenceable letName sem, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived3 (SharingObserver letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived3 :: (Derived (SharingObserver letName sem) a -> Derived (SharingObserver letName sem) b -> Derived (SharingObserver letName sem) c -> Derived (SharingObserver letName sem) d) -> SharingObserver letName sem a -> SharingObserver letName sem b -> SharingObserver letName sem c -> SharingObserver letName sem d Source #

Class LiftDerived4

class LiftDerived4 sem where Source #

Convenient wrapper of derive and liftDerived for functions with three arguments. Note that the default instance relies upon LiftDerived, not LiftDerived3.

Minimal complete definition

Nothing

Methods

liftDerived4 :: (Derived sem a -> Derived sem b -> Derived sem c -> Derived sem d -> Derived sem e) -> sem a -> sem b -> sem c -> sem d -> sem e Source #

default liftDerived4 :: LiftDerived sem => Derivable sem => (Derived sem a -> Derived sem b -> Derived sem c -> Derived sem d -> Derived sem e) -> sem a -> sem b -> sem c -> sem d -> sem e Source #

Instances

Instances details
LiftDerived4 (Reader r sem) Source # 
Instance details

Defined in Symantic.Semantics.Reader

Methods

liftDerived4 :: (Derived (Reader r sem) a -> Derived (Reader r sem) b -> Derived (Reader r sem) c -> Derived (Reader r sem) d -> Derived (Reader r sem) e) -> Reader r sem a -> Reader r sem b -> Reader r sem c -> Reader r sem d -> Reader r sem e Source #

(Eq letName, Hashable letName) => LiftDerived4 (SharingFinalizer letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived4 :: (Derived (SharingFinalizer letName sem) a -> Derived (SharingFinalizer letName sem) b -> Derived (SharingFinalizer letName sem) c -> Derived (SharingFinalizer letName sem) d -> Derived (SharingFinalizer letName sem) e) -> SharingFinalizer letName sem a -> SharingFinalizer letName sem b -> SharingFinalizer letName sem c -> SharingFinalizer letName sem d -> SharingFinalizer letName sem e Source #

(Referenceable letName sem, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived4 (SharingObserver letName sem) Source # 
Instance details

Defined in Symantic.Semantics.SharingObserver

Methods

liftDerived4 :: (Derived (SharingObserver letName sem) a -> Derived (SharingObserver letName sem) b -> Derived (SharingObserver letName sem) c -> Derived (SharingObserver letName sem) d -> Derived (SharingObserver letName sem) e) -> SharingObserver letName sem a -> SharingObserver letName sem b -> SharingObserver letName sem c -> SharingObserver letName sem d -> SharingObserver letName sem e Source #

Type synonyms FromDerived*

type FromDerived syn sem = (LiftDerived sem, syn (Derived sem)) Source #

Convenient type synonym for using liftDerived on Syntax (syn).

type FromDerived1 syn sem = (LiftDerived1 sem, syn (Derived sem)) Source #

type FromDerived2 syn sem = (LiftDerived2 sem, syn (Derived sem)) Source #

type FromDerived3 syn sem = (LiftDerived3 sem, syn (Derived sem)) Source #

type FromDerived4 syn sem = (LiftDerived4 sem, syn (Derived sem)) Source #