{-# LANGUAGE OverloadedStrings #-}

module Hydra.Sources.Tier2.CoreLanguage where

-- Standard Tier-2 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.Tier1.All

import Hydra.Sources.Tier2.Basics


hydraCoreLanguageModule :: Module
hydraCoreLanguageModule :: Module
hydraCoreLanguageModule = Namespace
-> [Element] -> [Module] -> [Module] -> Maybe String -> Module
Module Namespace
ns [Element]
elements
    [Module
hydraBasicsModule]
    [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
"Language constraints for Hydra Core"
  where
    ns :: Namespace
ns = String -> Namespace
Namespace String
"hydra/coreLanguage"
    elements :: [Element]
elements = [Definition Language -> Element
forall a. Definition a -> Element
el Definition Language
hydraCoreLanguageDef]

hydraCoreLanguageDef :: Definition Language
hydraCoreLanguageDef :: Definition Language
hydraCoreLanguageDef = Module -> String -> Datum Language -> Definition Language
forall a. Module -> String -> Datum a -> Definition a
definitionInModule Module
hydraCoreLanguageModule String
"hydraCoreLanguage" (Datum Language -> Definition Language)
-> Datum Language -> Definition Language
forall a b. (a -> b) -> a -> b
$
  String -> Datum Language -> Datum Language
forall a. String -> Datum a -> Datum a
doc String
"Language constraints for Java" (Datum Language -> Datum Language)
-> Datum Language -> Datum Language
forall a b. (a -> b) -> a -> b
$
  Type -> Datum Language -> Datum Language
forall a. Type -> Datum a -> Datum a
typed Type
languageT (Datum Language -> Datum Language)
-> Datum Language -> Datum Language
forall a b. (a -> b) -> a -> b
$
  Name -> [Field] -> Datum Language
forall a. Name -> [Field] -> Datum a
record Name
_Language [
    Name
_Language_nameName -> Datum Any -> Field
forall a. Name -> Datum a -> Field
>>: Name -> Datum Any -> Datum Any
forall a b. Name -> Datum a -> Datum b
wrap Name
_LanguageName Datum Any
"hydra/core",
    Name
_Language_constraintsName -> Datum Any -> Field
forall a. Name -> Datum a -> Field
>>: Name -> [Field] -> Datum Any
forall a. Name -> [Field] -> Datum a
record Name
_LanguageConstraints [
    Name
_LanguageConstraints_eliminationVariantsName -> Datum (Set EliminationVariant) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([EliminationVariant] -> Set EliminationVariant)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([EliminationVariant] -> Set EliminationVariant)
-> Datum [EliminationVariant] -> Datum (Set EliminationVariant)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [EliminationVariant] -> Datum [EliminationVariant]
forall a. Definition a -> Datum a
ref Definition [EliminationVariant]
eliminationVariantsDef,
    Name
_LanguageConstraints_literalVariantsName -> Datum (Set LiteralVariant) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([LiteralVariant] -> Set LiteralVariant)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([LiteralVariant] -> Set LiteralVariant)
-> Datum [LiteralVariant] -> Datum (Set LiteralVariant)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [LiteralVariant] -> Datum [LiteralVariant]
forall a. Definition a -> Datum a
ref Definition [LiteralVariant]
literalVariantsDef,
    Name
_LanguageConstraints_floatTypesName -> Datum (Set FloatType) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([FloatType] -> Set FloatType)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([FloatType] -> Set FloatType)
-> Datum [FloatType] -> Datum (Set FloatType)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [FloatType] -> Datum [FloatType]
forall a. Definition a -> Datum a
ref Definition [FloatType]
floatTypesDef,
    Name
_LanguageConstraints_functionVariantsName -> Datum (Set FunctionVariant) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([FunctionVariant] -> Set FunctionVariant)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([FunctionVariant] -> Set FunctionVariant)
-> Datum [FunctionVariant] -> Datum (Set FunctionVariant)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [FunctionVariant] -> Datum [FunctionVariant]
forall a. Definition a -> Datum a
ref Definition [FunctionVariant]
functionVariantsDef,
    Name
_LanguageConstraints_integerTypesName -> Datum (Set IntegerType) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([IntegerType] -> Set IntegerType)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([IntegerType] -> Set IntegerType)
-> Datum [IntegerType] -> Datum (Set IntegerType)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [IntegerType] -> Datum [IntegerType]
forall a. Definition a -> Datum a
ref Definition [IntegerType]
integerTypesDef,
    Name
_LanguageConstraints_termVariantsName -> Datum (Set TermVariant) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([TermVariant] -> Set TermVariant)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([TermVariant] -> Set TermVariant)
-> Datum [TermVariant] -> Datum (Set TermVariant)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [TermVariant] -> Datum [TermVariant]
forall a. Definition a -> Datum a
ref Definition [TermVariant]
termVariantsDef,
    Name
_LanguageConstraints_typeVariantsName -> Datum (Set TypeVariant) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([TypeVariant] -> Set TypeVariant)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([TypeVariant] -> Set TypeVariant)
-> Datum [TypeVariant] -> Datum (Set TypeVariant)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [TypeVariant] -> Datum [TypeVariant]
forall a. Definition a -> Datum a
ref Definition [TypeVariant]
typeVariantsDef,
    Name
_LanguageConstraints_typesName -> Datum (Any -> Bool) -> Field
forall a. Name -> Datum a -> Field
>>: Datum Bool -> Datum (Any -> Bool)
forall a b. Datum a -> Datum (b -> a)
constant Datum Bool
true]]