packages feed

domain-core-0.1.0.4: library/DomainCore/TH.hs

module DomainCore.TH where

import DomainCore.Model
import DomainCore.Prelude
import qualified DomainCore.Text as Text
import qualified Language.Haskell.TH as TH
import qualified THLego.Helpers as TH

-- |
-- Convert a model type definition into Template Haskell.
typeType ::
  -- | Model type.
  Type ->
  -- | Template Haskell type.
  TH.Type
typeType =
  \case
    AppType a ->
      foldl1 TH.AppT (fmap typeType a)
    RefType a ->
      TH.ConT (TH.textName a)
    ListType a ->
      TH.AppT TH.ListT (typeType a)
    TupleType a ->
      TH.multiAppT (TH.TupleT (length a)) (fmap typeType a)

-- |
-- Assemble a record field name.
recordFieldName ::
  -- | Prepend with underscore.
  Bool ->
  -- | Prefix with type name.
  Bool ->
  -- | Type name.
  Text ->
  -- | Label.
  Text ->
  -- | Template Haskell name.
  TH.Name
recordFieldName underscore prefixWithTypeName a b =
  TH.textName (Text.recordField underscore prefixWithTypeName a b)

-- |
-- Assemble a sum constructor name.
sumConstructorName ::
  -- | Type name.
  Text ->
  -- | Label.
  Text ->
  -- | Template Haskell name.
  TH.Name
sumConstructorName a b =
  TH.textName (Text.sumConstructor a b)