packages feed

hydra-kernel-0.16.1: src/main/haskell/Hydra/Dsl/Meta/Core.hs

{-# LANGUAGE FlexibleContexts #-}

-- | Haskell-specific convenience layer over the generated Hydra.Dsl.Core module.
-- Re-exports all generated DSL functions and adds AsTerm-flexible overrides
-- for functions commonly called with TypedBinding arguments.

module Hydra.Dsl.Meta.Core (
  module Hydra.Dsl.Core,
  module Hydra.Dsl.Meta.Core,
  nameLift,
) where

import Hydra.Kernel
import Hydra.Dsl.AsTerm
import Hydra.Dsl.Meta.Phantoms (nameLift, var, (~>))
import Hydra.Dsl.Core hiding (binding, injection, typeVariable)
import qualified Hydra.Dsl.Core as Gen

-- For helpers
import qualified Hydra.Dsl.Meta.Lib.Equality as Equality
import qualified Hydra.Dsl.Meta.Lib.Lists as Lists
import qualified Hydra.Dsl.Meta.Lib.Logic as Logic

import qualified Data.Map as M
import Prelude hiding (map, product)


-- | AsTerm-flexible overrides of generated functions.
-- These allow passing TypedBinding values where TypedTerm is expected.

binding :: AsTerm t Term => TypedTerm Name -> t -> TypedTerm (Maybe TypeScheme) -> TypedTerm Binding
binding n t ts = Gen.binding n (asTerm t) ts

equalNameList_ :: TypedTerm [Name] -> TypedTerm [Name] -> TypedTerm Bool
equalNameList_ lefts rights = Logic.and
  (Equality.equal (Lists.length lefts) (Lists.length rights))
  (Logic.ands $ Lists.zipWith equalName lefts rights)
  where
    equalName = "left" ~> "right" ~> Equality.equal
      (Gen.unName (var "left" :: TypedTerm Name))
      (Gen.unName (var "right" :: TypedTerm Name))

equalName_ :: TypedTerm Name -> TypedTerm Name -> TypedTerm Bool
equalName_ left right = Equality.equal (Gen.unName left) (Gen.unName right)

false :: TypedTerm Term
false = termLiteral $ literalBoolean $ TypedTerm $ TermLiteral $ LiteralBoolean False

injection :: AsTerm t Name => t -> TypedTerm Field -> TypedTerm Injection
injection n f = Gen.injection (asTerm n) f

typeVariable :: AsTerm t Name => t -> TypedTerm Type
typeVariable n = Gen.typeVariable (asTerm n)


-- | Non-standard helpers (used in kernel source modules)