symantic-base-0.1.0.20210703: Commonly useful symantics for Embedded Domain-Specific Languages (EDSL)
Safe HaskellNone
LanguageHaskell2010

Symantic.Typed.ObserveSharing

Synopsis

Class Letable

class Letable letName repr where Source #

This class is not for end-users like usual symantic operators, here shareable and ref are introduced by observeSharing.

Minimal complete definition

Nothing

Methods

ref :: Bool -> letName -> repr a Source #

(ref isRec letName) is a reference to (letName). (isRec) is True iif. this reference is recursive, ie. is reachable within its shareable definition.

default ref :: FromDerived (Letable letName) repr => Bool -> letName -> repr a Source #

shareable :: letName -> repr a -> repr a Source #

(shareable letName x) let-binds (letName) to be equal to (x).

default shareable :: FromDerived1 (Letable letName) repr => letName -> repr a -> repr a Source #

Instances

Instances details
(Letable letName repr, Eq letName, Hashable letName, Show letName) => Letable letName (FinalizeSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

ref :: Bool -> letName -> FinalizeSharing letName repr a Source #

shareable :: letName -> FinalizeSharing letName repr a -> FinalizeSharing letName repr a Source #

Letable letName (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

ref :: Bool -> letName -> ObserveSharing letName repr a Source #

shareable :: letName -> ObserveSharing letName repr a -> ObserveSharing letName repr a Source #

Class MakeLetName

class MakeLetName letName where Source #

Methods

makeLetName :: SharingName -> IO letName Source #

Type ShowLetName

class ShowLetName (showName :: Bool) letName where Source #

Useful on golden unit tests because StableName change often when changing unrelated source code or even changing basic GHC or executable flags.

Methods

showLetName :: letName -> String Source #

Instances

Instances details
ShowLetName 'False letName Source #

Always return "hidden",

Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

showLetName :: letName -> String Source #

Show letName => ShowLetName 'True letName Source #

Like Show.

Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

showLetName :: letName -> String Source #

Type SharingName

data SharingName Source #

Note that the observable sharing enabled by StableName is not perfect as it will not observe all the sharing explicitely done.

Note also that the observed sharing could be different between ghc and ghci.

Constructors

forall a. SharingName (StableName a) 

Instances

Instances details
Eq SharingName Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Hashable SharingName Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

makeSharingName :: a -> SharingName Source #

(makeSharingName x) is like (makeStableName x) but it also forces evaluation of (x) to ensure that the StableName is correct first time, which avoids to produce a tree bigger than needed.

Note that this function uses unsafePerformIO instead of returning in IO, this is apparently required to avoid infinite loops due to unstable StableName in compiled code, and sometimes also in ghci.

Note that maybe pseq should be used here.

Type ObserveSharing

newtype ObserveSharing letName repr a Source #

Instances

Instances details
Letsable letName (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

lets :: LetBindings letName (ObserveSharing letName repr) -> ObserveSharing letName repr a -> ObserveSharing letName repr a Source #

Letable letName (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

ref :: Bool -> letName -> ObserveSharing letName repr a Source #

shareable :: letName -> ObserveSharing letName repr a -> ObserveSharing letName repr a Source #

(Letable letName repr, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived3 (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived3 :: (Derived (ObserveSharing letName repr) a -> Derived (ObserveSharing letName repr) b -> Derived (ObserveSharing letName repr) c -> Derived (ObserveSharing letName repr) d) -> ObserveSharing letName repr a -> ObserveSharing letName repr b -> ObserveSharing letName repr c -> ObserveSharing letName repr d Source #

(Letable letName repr, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived2 (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived2 :: (Derived (ObserveSharing letName repr) a -> Derived (ObserveSharing letName repr) b -> Derived (ObserveSharing letName repr) c) -> ObserveSharing letName repr a -> ObserveSharing letName repr b -> ObserveSharing letName repr c Source #

(Letable letName repr, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived1 (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived1 :: (Derived (ObserveSharing letName repr) a -> Derived (ObserveSharing letName repr) b) -> ObserveSharing letName repr a -> ObserveSharing letName repr b Source #

(Letable letName repr, MakeLetName letName, Eq letName, Hashable letName, Show letName) => LiftDerived (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived :: Derived (ObserveSharing letName repr) a -> ObserveSharing letName repr a Source #

type Derived (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

type Derived (ObserveSharing letName repr) = FinalizeSharing letName repr

observeSharing :: Eq letName => Hashable letName => Show letName => ObserveSharing letName repr a -> WithSharing letName repr a Source #

Interpreter detecting some (Haskell embedded) let definitions used at least once and/or recursively, in order to replace them with the shareable and ref combinators. See Type-safe observable sharing in Haskell

Beware not to apply observeSharing more than once on the same term otherwise some shareable introduced by the first call would be removed by the second call.

Type SomeLet

data SomeLet repr Source #

Constructors

forall a. SomeLet (repr a) 

Type WithSharing

type WithSharing letName repr a = (repr a, HashMap letName (SomeLet repr)) Source #

Type ObserveSharingState

data ObserveSharingState letName Source #

Constructors

ObserveSharingState 

Fields

observeSharingNode :: Eq letName => Hashable letName => Show letName => Letable letName repr => MakeLetName letName => ObserveSharing letName repr a -> ObserveSharing letName repr a Source #

Type FinalizeSharing

newtype FinalizeSharing letName repr a Source #

Remove shareable when non-recursive or unused or replace it by ref, moving shareables to the top.

Constructors

FinalizeSharing 

Fields

Instances

Instances details
(Letable letName repr, Eq letName, Hashable letName, Show letName) => Letable letName (FinalizeSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

ref :: Bool -> letName -> FinalizeSharing letName repr a Source #

shareable :: letName -> FinalizeSharing letName repr a -> FinalizeSharing letName repr a Source #

(Eq letName, Hashable letName) => LiftDerived3 (FinalizeSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived3 :: (Derived (FinalizeSharing letName repr) a -> Derived (FinalizeSharing letName repr) b -> Derived (FinalizeSharing letName repr) c -> Derived (FinalizeSharing letName repr) d) -> FinalizeSharing letName repr a -> FinalizeSharing letName repr b -> FinalizeSharing letName repr c -> FinalizeSharing letName repr d Source #

(Eq letName, Hashable letName) => LiftDerived2 (FinalizeSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived2 :: (Derived (FinalizeSharing letName repr) a -> Derived (FinalizeSharing letName repr) b -> Derived (FinalizeSharing letName repr) c) -> FinalizeSharing letName repr a -> FinalizeSharing letName repr b -> FinalizeSharing letName repr c Source #

(Eq letName, Hashable letName) => LiftDerived1 (FinalizeSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived1 :: (Derived (FinalizeSharing letName repr) a -> Derived (FinalizeSharing letName repr) b) -> FinalizeSharing letName repr a -> FinalizeSharing letName repr b Source #

(Eq letName, Hashable letName) => LiftDerived (FinalizeSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

liftDerived :: Derived (FinalizeSharing letName repr) a -> FinalizeSharing letName repr a Source #

type Derived (FinalizeSharing _letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

type Derived (FinalizeSharing _letName repr) = repr

Type LetBindings

type LetBindings letName repr = HashMap letName (SomeLet repr) Source #

Class Letsable

class Letsable letName repr where Source #

Minimal complete definition

Nothing

Methods

lets :: LetBindings letName repr -> repr a -> repr a Source #

(lets defs x) let-binds (defs) in (x).

default lets :: Derivable repr => FromDerived1 (Letsable letName) repr => LetBindings letName repr -> repr a -> repr a Source #

Instances

Instances details
Letsable letName (ObserveSharing letName repr) Source # 
Instance details

Defined in Symantic.Typed.ObserveSharing

Methods

lets :: LetBindings letName (ObserveSharing letName repr) -> ObserveSharing letName repr a -> ObserveSharing letName repr a Source #