packages feed

hydra-0.12.0: src/main/haskell/Hydra/Dsl/Coders.hs

module Hydra.Dsl.Coders where

import Hydra.Kernel
import Hydra.Dsl.Phantoms as Phantoms
import qualified Hydra.Dsl.Core as Core
import Hydra.Dsl.Lib.Sets as Sets
import Hydra.Dsl.Mantle as Mantle
import qualified Hydra.Dsl.TTypes as T

import qualified Data.Map as M
import qualified Data.Set as S


adapterContext :: TTerm Graph -> TTerm Language -> TTerm (M.Map Name (Adapter AdapterContext AdapterContext Type Type Term Term)) -> TTerm AdapterContext
adapterContext graph language adapters = Phantoms.record _AdapterContext [
  _AdapterContext_graph>>: graph,
  _AdapterContext_language>>: language,
  _AdapterContext_adapters>>: adapters]

adapterContextGraph :: TTerm AdapterContext -> TTerm Graph
adapterContextGraph c = project _AdapterContext _AdapterContext_graph @@ c

adapterContextLanguage :: TTerm AdapterContext -> TTerm Language
adapterContextLanguage c = project _AdapterContext _AdapterContext_language @@ c

adapterContextAdapters :: TTerm AdapterContext -> TTerm (M.Map Name (Adapter AdapterContext AdapterContext Type Type Term Term))
adapterContextAdapters c = project _AdapterContext _AdapterContext_adapters @@ c

coderDirectionEncode :: TTerm CoderDirection
coderDirectionEncode = unitVariant _CoderDirection _CoderDirection_encode

coderDirectionDecode :: TTerm CoderDirection
coderDirectionDecode = unitVariant _CoderDirection _CoderDirection_decode

language :: TTerm LanguageName -> TTerm LanguageConstraints -> TTerm Language
language name constraints = record _Language [
    _Language_name>>: name,
    _Language_constraints>>: constraints]

languageName :: TTerm String -> TTerm LanguageName
languageName = wrap _LanguageName

unLanguageName :: TTerm LanguageName -> TTerm String
unLanguageName n = unwrap _LanguageName @@ n

-- TODO: resolve _Language_name/_LanguageName conflict
languageNameProjection :: TTerm Language -> TTerm LanguageName
languageNameProjection c = project _Language _Language_name @@ c

-- TODO: resolve _Language_constraints/LanguageConstraints conflict
languageConstraintsProjection :: TTerm Language -> TTerm LanguageConstraints
languageConstraintsProjection c = project _Language _Language_constraints @@ c

languageConstraints :: TTerm (S.Set EliminationVariant)
                    -> TTerm (S.Set LiteralVariant)
                    -> TTerm (S.Set FloatType)
                    -> TTerm (S.Set FunctionVariant)
                    -> TTerm (S.Set IntegerType)
                    -> TTerm (S.Set TermVariant)
                    -> TTerm (S.Set TypeVariant)
                    -> TTerm (Type -> Bool)
                    -> TTerm LanguageConstraints
languageConstraints eliminationVariants
                    literalVariants
                    floatTypes
                    functionVariants
                    integerTypes
                    termVariants
                    typeVariants
                    types = record _LanguageConstraints [
    _LanguageConstraints_eliminationVariants>>: eliminationVariants,
    _LanguageConstraints_literalVariants>>: literalVariants,
    _LanguageConstraints_floatTypes>>: floatTypes,
    _LanguageConstraints_functionVariants>>: functionVariants,
    _LanguageConstraints_integerTypes>>: integerTypes,
    _LanguageConstraints_termVariants>>: termVariants,
    _LanguageConstraints_typeVariants>>: typeVariants,
    _LanguageConstraints_types>>: types]

languageConstraintsEliminationVariants :: TTerm LanguageConstraints -> TTerm (S.Set EliminationVariant)
languageConstraintsEliminationVariants lc = project _LanguageConstraints _LanguageConstraints_eliminationVariants @@ lc

languageConstraintsLiteralVariants :: TTerm LanguageConstraints -> TTerm (S.Set LiteralVariant)
languageConstraintsLiteralVariants lc = project _LanguageConstraints _LanguageConstraints_literalVariants @@ lc

languageConstraintsFloatTypes :: TTerm LanguageConstraints -> TTerm (S.Set FloatType)
languageConstraintsFloatTypes lc = project _LanguageConstraints _LanguageConstraints_floatTypes @@ lc

languageConstraintsFunctionVariants :: TTerm LanguageConstraints -> TTerm (S.Set FunctionVariant)
languageConstraintsFunctionVariants lc = project _LanguageConstraints _LanguageConstraints_functionVariants @@ lc

languageConstraintsIntegerTypes :: TTerm LanguageConstraints -> TTerm (S.Set IntegerType)
languageConstraintsIntegerTypes lc = project _LanguageConstraints _LanguageConstraints_integerTypes @@ lc

languageConstraintsTermVariants :: TTerm LanguageConstraints -> TTerm (S.Set TermVariant)
languageConstraintsTermVariants lc = project _LanguageConstraints _LanguageConstraints_termVariants @@ lc

languageConstraintsTypeVariants :: TTerm LanguageConstraints -> TTerm (S.Set TypeVariant)
languageConstraintsTypeVariants lc = project _LanguageConstraints _LanguageConstraints_typeVariants @@ lc

languageConstraintsTypes :: TTerm LanguageConstraints -> TTerm (Type -> Bool)
languageConstraintsTypes lc = project _LanguageConstraints _LanguageConstraints_types @@ lc

traversalOrderPre = unitVariant _TraversalOrder _TraversalOrder_pre
traversalOrderPost = unitVariant _TraversalOrder _TraversalOrder_post