module Hydra.Sources.Tier1.Constants where

-- Standard Tier-1 imports
import           Prelude hiding ((++))
import qualified Data.List                 as L
import qualified Data.Map                  as M
import qualified Data.Set                  as S
import qualified Data.Maybe                as Y
import           Hydra.Dsl.Base            as Base
import qualified Hydra.Dsl.Core            as Core
import qualified Hydra.Dsl.Graph           as Graph
import qualified Hydra.Dsl.Lib.Equality    as Equality
import qualified Hydra.Dsl.Lib.Flows       as Flows
import qualified Hydra.Dsl.Lib.Io          as Io
import qualified Hydra.Dsl.Lib.Lists       as Lists
import qualified Hydra.Dsl.Lib.Literals    as Literals
import qualified Hydra.Dsl.Lib.Logic       as Logic
import qualified Hydra.Dsl.Lib.Maps        as Maps
import qualified Hydra.Dsl.Lib.Math        as Math
import qualified Hydra.Dsl.Lib.Optionals   as Optionals
import qualified Hydra.Dsl.Lib.Sets        as Sets
import           Hydra.Dsl.Lib.Strings     as Strings
import qualified Hydra.Dsl.Module          as Module
import qualified Hydra.Dsl.Terms           as Terms
import qualified Hydra.Dsl.Types           as Types
import           Hydra.Sources.Tier0.All


constantsDefinition :: String -> TTerm a -> TElement a
constantsDefinition :: forall a. String -> TTerm a -> TElement a
constantsDefinition = Module -> String -> TTerm a -> TElement a
forall a. Module -> String -> TTerm a -> TElement a
definitionInModule Module
hydraConstantsModule

hydraConstantsModule :: Module
hydraConstantsModule :: Module
hydraConstantsModule = Namespace
-> [Element] -> [Module] -> [Module] -> Maybe String -> Module
Module (String -> Namespace
Namespace String
"hydra/constants") [Element]
elements [] [Module]
tier0Modules (Maybe String -> Module) -> Maybe String -> Module
forall a b. (a -> b) -> a -> b
$
    String -> Maybe String
forall a. a -> Maybe a
Just (String
"A module for tier-0 constants.")
  where
   elements :: [Element]
elements = [
     TElement String -> Element
forall a. TElement a -> Element
el TElement String
ignoredVariableDef,
     TElement Name -> Element
forall a. TElement a -> Element
el TElement Name
placeholderNameDef,
     TElement Int -> Element
forall a. TElement a -> Element
el TElement Int
maxTraceDepthDef]

ignoredVariableDef :: TElement String
ignoredVariableDef :: TElement String
ignoredVariableDef = String -> TTerm String -> TElement String
forall a. String -> TTerm a -> TElement a
constantsDefinition String
"ignoredVariable" (TTerm String -> TElement String)
-> TTerm String -> TElement String
forall a b. (a -> b) -> a -> b
$
  String -> TTerm String
string String
"_"

placeholderNameDef :: TElement Name
placeholderNameDef :: TElement Name
placeholderNameDef = String -> TTerm Name -> TElement Name
forall a. String -> TTerm a -> TElement a
constantsDefinition String
"placeholderName" (TTerm Name -> TElement Name) -> TTerm Name -> TElement Name
forall a b. (a -> b) -> a -> b
$
  String -> TTerm Name -> TTerm Name
forall a. String -> TTerm a -> TTerm a
doc String
"A placeholder name for row types as they are being constructed" (TTerm Name -> TTerm Name) -> TTerm Name -> TTerm Name
forall a b. (a -> b) -> a -> b
$
  Name -> TTerm String -> TTerm Name
forall a b. Name -> TTerm a -> TTerm b
wrap Name
_Name (TTerm String -> TTerm Name) -> TTerm String -> TTerm Name
forall a b. (a -> b) -> a -> b
$ String -> TTerm String
string String
"Placeholder"

maxTraceDepthDef :: TElement Int
maxTraceDepthDef :: TElement Int
maxTraceDepthDef = String -> TTerm Int -> TElement Int
forall a. String -> TTerm a -> TElement a
constantsDefinition String
"maxTraceDepth" (TTerm Int -> TElement Int) -> TTerm Int -> TElement Int
forall a b. (a -> b) -> a -> b
$ Int -> TTerm Int
int32 Int
50