ondim-0.1.0.0
Safe HaskellNone
LanguageGHC2021

Ondim.State

Synopsis

Namespace maps

type NamespaceMap m = NamespaceMapM m () Source #

NamespaceMap provides a monad interface for defining namespaces declaratively. You should enable the BlockArguments extension when using it. For instance:

expandChildren myNode
  `binding` do
    "something" ## myTypedExp
    "is-cow" #* ifElse isCow
    "name" #@ "Joana"
    "properties" #. do
      "age" #@ show age
      "state" #@ "hungry"

binding :: Ondim s a -> NamespaceMap s -> Ondim s a Source #

Infix version of withNamespace meant to bind expansions more conveniently by using NamespaceMaps.

(#:) :: Text -> NamespaceItem m -> NamespaceMap m infixr 0 Source #

Infix to add a NamespaceItem to a NamespaceMap.

unbind :: Text -> NamespaceMap m Source #

Remove a previously added item from the NamespaceMap.

Typed expansions

(##) :: (HasCallStack, Typeable t) => Text -> Expansion m t -> NamespaceMap m infixr 0 Source #

Infix to add an Expansion to a NamespaceMap.

name ## expansion = name #: typedExpansion expansion

Polymorphic expansions

(#*) :: HasCallStack => Text -> PolyExpansion m -> NamespaceMap m infixr 0 Source #

Infix to add a PolyExpansion to a NamespaceMap.

name #* expansion = name #: polyExpansion expansion

Templates

(#%) :: (HasCallStack, OndimNode a) => Text -> a -> NamespaceMap m infixr 0 Source #

Infix to add a template (any type with an OndimNode instance) to a NamespaceMap.

name #% template = name #: templateData template

Textual templates

(#@) :: HasCallStack => Text -> Text -> NamespaceMap m infixr 0 Source #

Infix to add a textual data to a NamespaceMap. Just a specialized version of #%.

name #@ text = name #: textData text

Namespaces

(#.) :: Text -> NamespaceMap m -> NamespaceMap m infixr 0 Source #

Infix to nest a NamespaceMap inside a NamespaceMap.

name #. nsMap = name #: namespace nsMap

Datatypes

newtype OndimState s Source #

Ondim's expansion state

Constructors

OndimState 

Fields

Instances

Instances details
Monoid (OndimState s) Source # 
Instance details

Defined in Ondim.Internal.Basic

Semigroup (OndimState s) Source # 
Instance details

Defined in Ondim.Internal.Basic

Generic (OndimState s) Source # 
Instance details

Defined in Ondim.Internal.Basic

Associated Types

type Rep (OndimState s) 
Instance details

Defined in Ondim.Internal.Basic

type Rep (OndimState s) = D1 ('MetaData "OndimState" "Ondim.Internal.Basic" "ondim-0.1.0.0-inplace" 'True) (C1 ('MetaCons "OndimState" 'PrefixI 'True) (S1 ('MetaSel ('Just "expansions") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Namespace s))))

Methods

from :: OndimState s -> Rep (OndimState s) x #

to :: Rep (OndimState s) x -> OndimState s #

type Rep (OndimState s) Source # 
Instance details

Defined in Ondim.Internal.Basic

type Rep (OndimState s) = D1 ('MetaData "OndimState" "Ondim.Internal.Basic" "ondim-0.1.0.0-inplace" 'True) (C1 ('MetaCons "OndimState" 'PrefixI 'True) (S1 ('MetaSel ('Just "expansions") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Namespace s))))

data NamespaceItem s where Source #

An opaque datatype that should be regarded as a sum of four possible types:

  1. Typed expansions, i.e., expansions that apply to a single type (use the typedExpansion constructor).
  2. Polymorphic expansions, i.e., expansions that are polymophic over types with OndimNode instances (use the polyExpansion constructor).
  3. Templates, i.e., raw node data that represents templates. (use the templateData constructor).
  4. Namespaces, i.e., nested namespaces. (use the namespace constructor).

Constructors

TypedExpansion :: forall a s. Typeable a => DefinitionSite -> Expansion s a -> NamespaceItem s 
PolyExpansion :: forall s. DefinitionSite -> PolyExpansion s -> NamespaceItem s 
TemplateData :: forall a s. OndimNode a => DefinitionSite -> a -> NamespaceItem s 
NamespaceData :: forall s. Namespace s -> NamespaceItem s 

newtype Namespace m Source #

A namespace. Internally represented as a hashmap from Text keys to NamespaceItem m values.

Constructors

Namespace 

Instances

Instances details
Monoid (Namespace s) Source # 
Instance details

Defined in Ondim.Internal.Basic

Semigroup (Namespace s) Source # 
Instance details

Defined in Ondim.Internal.Basic

Methods

(<>) :: Namespace s -> Namespace s -> Namespace s #

sconcat :: NonEmpty (Namespace s) -> Namespace s #

stimes :: Integral b => b -> Namespace s -> Namespace s #

Generic (Namespace m) Source # 
Instance details

Defined in Ondim.Internal.Basic

Associated Types

type Rep (Namespace m) 
Instance details

Defined in Ondim.Internal.Basic

type Rep (Namespace m) = D1 ('MetaData "Namespace" "Ondim.Internal.Basic" "ondim-0.1.0.0-inplace" 'True) (C1 ('MetaCons "Namespace" 'PrefixI 'True) (S1 ('MetaSel ('Just "hashmap") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (HashMap Text (NamespaceItem m)))))

Methods

from :: Namespace m -> Rep (Namespace m) x #

to :: Rep (Namespace m) x -> Namespace m #

type Rep (Namespace m) Source # 
Instance details

Defined in Ondim.Internal.Basic

type Rep (Namespace m) = D1 ('MetaData "Namespace" "Ondim.Internal.Basic" "ondim-0.1.0.0-inplace" 'True) (C1 ('MetaCons "Namespace" 'PrefixI 'True) (S1 ('MetaSel ('Just "hashmap") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (HashMap Text (NamespaceItem m)))))

Manipulate the whole state

getOndimS :: Ondim s (OndimState s) Source #

Get the Ondim state.

Manipulate the state by keys

withSomeExpansion :: Text -> Maybe (NamespaceItem s) -> Ondim s a -> Ondim s a Source #

Either bind or unbind an expansion locally.

putSomeExpansion :: Text -> Maybe (NamespaceItem s) -> Ondim s () Source #

Either put or delete an expansion from the state.

withoutExpansions :: [Text] -> Ondim s a -> Ondim s a Source #

Unbind a list of expansions locally.

withNamespace :: Namespace s -> Ondim s a -> Ondim s a Source #

Bind a namespace locally.

Altering namespaces