packages feed

hydra-0.12.0: src/main/haskell/Hydra/Sources/Test/TestGraph.hs

module Hydra.Sources.Test.TestGraph where

import Hydra.Kernel
import qualified Hydra.Dsl.Core          as Core
import qualified Hydra.Dsl.Graph         as Graph
import qualified Hydra.Dsl.Module        as Module
import qualified Hydra.Dsl.Lib.Chars     as Chars
import qualified Hydra.Dsl.Lib.Equality  as Equality
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.Phantoms      as Phantoms
import qualified Hydra.Dsl.Lib.Sets      as Sets
import           Hydra.Dsl.Lib.Strings   as Strings
import qualified Hydra.Dsl.Terms         as Terms
import qualified Hydra.Dsl.Types         as Types
import           Hydra.Sources.Kernel.Types.All
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 qualified Hydra.Dsl.TTypes as T
import           Hydra.Dsl.TTerms as TTerms


testGraphDefinition :: String -> TTerm a -> TBinding a
testGraphDefinition = definitionInModule testGraphModule

testGraphModule :: Module
testGraphModule = Module (Namespace "hydra.test.testGraph") elements
    []
    kernelTypesModules $
    Just ("A module defining the graph used in the test suite.")
  where
    elements = [
      el testTypeLatLonNameDef,
      el testTypeLatLonPolyNameDef,
      el latlonRecordDef,
      el testTypeLatLonDef,
      el testTypeLatLonPolyDef,
      el testTypeStringAliasDef,
      el testTypeStringAliasNameDef,
      el testTypePolymorphicWrapperDef,
      el testTypePolymorphicWrapperNameDef,
      el testElementArthurDef,
      el testElementFirstNameDef,
--      el testGraphDef, -- TODO
      el testNamespaceDef,
--      el testSchemaGraphDef, -- TODO
      el testSchemaNamespaceDef,
      el testDataArthurDef,
      el testTypeBuddyListADef,
      el testTypeBuddyListANameDef,
      el testTypeBuddyListBDef,
      el testTypeBuddyListBNameDef,
      el testTypeComparisonDef,
      el testTypeComparisonNameDef,
      el testTypeIntListDef,
      el testTypeIntListNameDef,
      el testTypeHydraLiteralTypeDef,
      el testTypeHydraLiteralTypeNameDef,
      el testTypeHydraTypeDef,
      el testTypeHydraTypeNameDef,
      el testTypeListDef,
      el testTypeListNameDef,
      el testTypeNumberDef,
      el testTypeNumberNameDef,
      el testTypePersonDef,
      el testTypePersonNameDef,
      el testTypePersonOrSomethingDef,
      el testTypePersonOrSomethingNameDef,
      el testTypeSimpleNumberDef,
      el testTypeSimpleNumberNameDef,
      el testTypeTimestampDef,
      el testTypeTimestampNameDef,
      el testTypeUnionMonomorphicDef,
      el testTypeUnionMonomorphicNameDef,
      el testTypeUnionPolymorphicRecursiveDef,
      el testTypeUnionPolymorphicRecursiveNameDef,
      el testTypeUnitDef,
      el testTypeUnitNameDef]

testGraphType :: String -> TTerm Type -> TBinding Type
testGraphType name = testGraphDefinition name . firstClassType

testTypeLatLonNameDef :: TBinding Name
testTypeLatLonNameDef = testGraphDefinition "testTypeLatLonName" $
  name "LatLon"

testTypeLatLonPolyNameDef :: TBinding Name
testTypeLatLonPolyNameDef = testGraphDefinition "testTypeLatLonPolyName" $
  name "LatLonPoly"

latlonRecordDef :: TBinding (Float -> Float -> Term)
latlonRecordDef = testGraphDefinition "latlonRecord" $
  Phantoms.lambdas ["lat", "lon"] $ record (ref testTypeLatLonNameDef) [
    "lat">: float32Lift $ varPhantom "lat",
    "lon">: float32Lift $ varPhantom "lon"]

testTypeLatLonDef :: TBinding Type
testTypeLatLonDef = testGraphType "testTypeLatLon" $
  T.record (ref testTypeLatLonNameDef) [
    "lat">: T.float32,
    "lon">: T.float32]

testTypeLatLonPolyDef :: TBinding Type
testTypeLatLonPolyDef = testGraphType "testTypeLatLonPoly" $
  T.forAll "a" $ T.record (ref testTypeLatLonPolyNameDef) [
    "lat">: T.var "a",
    "lon">: T.var "a"]

testTypeStringAliasDef :: TBinding Type
testTypeStringAliasDef = testGraphType "testTypeStringAlias" $
  Core.typeWrap $ Core.wrappedType (ref testTypeStringAliasNameDef) T.string

testTypeStringAliasNameDef :: TBinding Name
testTypeStringAliasNameDef = testGraphDefinition "testTypeStringAliasName" $
  name "StringTypeAlias"

testTypePolymorphicWrapperDef :: TBinding Type
testTypePolymorphicWrapperDef = testGraphType "testTypePolymorphicWrapper" $
  T.forAll "a" $ Core.typeWrap $ Core.wrappedType (ref testTypePolymorphicWrapperNameDef) (T.list $ T.var "a")

testTypePolymorphicWrapperNameDef :: TBinding Name
testTypePolymorphicWrapperNameDef = testGraphDefinition "testTypePolymorphicWrapperName" $
  name "PolymorphicWrapper"

testElementArthurDef :: TBinding Binding
testElementArthurDef = testGraphDefinition "testElementArthur" $
  Core.binding
    (name "firstName")
    (ref testDataArthurDef)
    (Phantoms.just $ Core.typeScheme (Phantoms.list []) (Core.typeVariable $ ref testTypePersonNameDef))

testElementFirstNameDef :: TBinding Binding
testElementFirstNameDef = testGraphDefinition "testElementFirstName" $
  Core.binding
    (name "firstName")
    (project (ref testTypePersonNameDef) (name "firstName"))
    (Phantoms.just $ Core.typeScheme (Phantoms.list [])
      (Core.typeFunction $ Core.functionType (Core.typeVariable $ ref testTypePersonNameDef) T.string))

--testGraph :: Graph
--testGraph = elementsToGraph hydraCoreGraph (Just testSchemaGraph) [testElementArthur, testElementFirstName]

testNamespaceDef :: TBinding Namespace
testNamespaceDef = testGraphDefinition "testNamespace" $ Module.namespace $ Phantoms.string "testGraph"

--testSchemaGraph :: Graph
--testSchemaGraph = elementsToGraph hydraCoreGraph (Just hydraCoreGraph) [
--    def testTypeBuddyListAName testTypeBuddyListA,
--    def testTypeBuddyListBName testTypeBuddyListB,
--    def testTypeComparisonName testTypeComparison,
--    def testTypeIntListName testTypeIntList,
--    def testTypeHydraLiteralTypeName testTypeHydraLiteralType,
--    def testTypeHydraTypeName testTypeHydraType,
--    def testTypeLatLonName testTypeLatLon,
--    def testTypeLatLonPolyName testTypeLatLonPoly,
--    def testTypeListName testTypeList,
--    def testTypeNumberName testTypeNumber,
--    def testTypePersonName testTypePerson,
--    def testTypePersonOrSomethingName testTypePersonOrSomething,
--    def testTypeSimpleNumberName testTypeSimpleNumber,
--    def testTypeStringAliasName $ Ann.doc "An alias for the string type" testTypeStringAlias,
--    def testTypeTimestampName testTypeTimestamp,
--    def testTypeUnionMonomorphicName testTypeUnionMonomorphic,
--    def testTypeUnionPolymorphicRecursiveName testTypeUnionPolymorphicRecursive,
--    def testTypeUnitName testTypeUnit]
--  where
--    def = typeElement

testSchemaNamespaceDef :: TBinding Namespace
testSchemaNamespaceDef = testGraphDefinition "testSchemaNamespace" $ Module.namespace $ Phantoms.string "testSchemaGraph"

testDataArthurDef :: TBinding Term
testDataArthurDef = testGraphDefinition "testDataArthur" $
  record (ref testTypePersonNameDef) [
    "firstName">: string "Arthur",
    "lastName">: string "Dent",
    "age">: int32 42]

testTypeBuddyListADef :: TBinding Type
testTypeBuddyListADef = testGraphType "testTypeBuddyListA" $
  T.forAll "a" $ T.record (ref testTypeBuddyListANameDef) [
    "head">: T.var "a",
    "tail">: T.optional $
      T.apply (Core.typeVariable $ ref testTypeBuddyListBNameDef) (T.var "a")]

testTypeBuddyListANameDef :: TBinding Name
testTypeBuddyListANameDef = testGraphDefinition "testTypeBuddyListAName" $
  name "BuddyListA"

testTypeBuddyListBDef :: TBinding Type
testTypeBuddyListBDef = testGraphType "testTypeBuddyListB" $
  T.forAll "a" $ T.record (ref testTypeBuddyListBNameDef) [
    "head">: T.var "a",
    "tail">: T.optional $
      T.apply (Core.typeVariable $ ref testTypeBuddyListANameDef) (T.var "a")]

testTypeBuddyListBNameDef :: TBinding Name
testTypeBuddyListBNameDef = testGraphDefinition "testTypeBuddyListBName" $
  name "BuddyListB"

testTypeComparisonDef :: TBinding Type
testTypeComparisonDef = testGraphType "testTypeComparison" $
  T.union (ref testTypeComparisonNameDef) [
    "lessThan">: T.unit,
    "equalTo">: T.unit,
    "greaterThan">: T.unit]

testTypeComparisonNameDef :: TBinding Name
testTypeComparisonNameDef = testGraphDefinition "testTypeComparisonName" $
  name "Comparison"

testTypeIntListDef :: TBinding Type
testTypeIntListDef = testGraphType "testTypeIntList" $
  T.record (ref testTypeIntListNameDef) [
    "head">: T.int32,
    "tail">: T.optional $ Core.typeVariable (ref testTypeIntListNameDef)]

testTypeIntListNameDef :: TBinding Name
testTypeIntListNameDef = testGraphDefinition "testTypeIntListName" $
  name "IntList"

testTypeHydraLiteralTypeDef :: TBinding Type
testTypeHydraLiteralTypeDef = testGraphType "testTypeHydraLiteralType" $
  T.union (ref testTypeHydraLiteralTypeNameDef) [
    "boolean">: T.boolean,
    "string">: T.string]

testTypeHydraLiteralTypeNameDef :: TBinding Name
testTypeHydraLiteralTypeNameDef = testGraphDefinition "testTypeHydraLiteralTypeName" $
  name "HydraLiteralType"

testTypeHydraTypeDef :: TBinding Type
testTypeHydraTypeDef = testGraphType "testTypeHydraType" $
  T.union (ref testTypeHydraTypeNameDef) [
    "literal">: Core.typeVariable $ ref testTypeHydraLiteralTypeNameDef,
    "list">: Core.typeVariable $ ref testTypeHydraTypeNameDef]

testTypeHydraTypeNameDef :: TBinding Name
testTypeHydraTypeNameDef = testGraphDefinition "testTypeHydraTypeName" $
  name "HydraType"

testTypeListDef :: TBinding Type
testTypeListDef = testGraphType "testTypeList" $
  T.forAll "a" $ T.record (ref testTypeListNameDef) [
    "head">: T.var "a",
    "tail">: T.optional $
      T.apply (Core.typeVariable $ ref testTypeListNameDef) (T.var "a")]

testTypeListNameDef :: TBinding Name
testTypeListNameDef = testGraphDefinition "testTypeListName" $
  name "List"

testTypeNumberDef :: TBinding Type
testTypeNumberDef = testGraphType "testTypeNumber" $
  T.union (ref testTypeNumberNameDef) [
    "int">: T.int32,
    "float">: T.float32]

testTypeNumberNameDef :: TBinding Name
testTypeNumberNameDef = testGraphDefinition "testTypeNumberName" $
  name "Number"

testTypePersonDef :: TBinding Type
testTypePersonDef = testGraphType "testTypePerson" $
  T.record (ref testTypePersonNameDef) [
    "firstName">: T.string,
    "lastName">: T.string,
    "age">: T.int32]

testTypePersonNameDef :: TBinding Name
testTypePersonNameDef = testGraphDefinition "testTypePersonName" $
  name "Person"

testTypePersonOrSomethingDef :: TBinding Type
testTypePersonOrSomethingDef = testGraphType "testTypePersonOrSomething" $
  T.forAll "a" $ T.union (ref testTypePersonOrSomethingNameDef) [
    "person">: Core.typeVariable $ ref testTypePersonNameDef,
    "other">: T.var "a"]

testTypePersonOrSomethingNameDef :: TBinding Name
testTypePersonOrSomethingNameDef = testGraphDefinition "testTypePersonOrSomethingName" $
  name "PersonOrSomething"

testTypeSimpleNumberDef :: TBinding Type
testTypeSimpleNumberDef = testGraphType "testTypeSimpleNumber" $
  T.union (ref testTypeSimpleNumberNameDef) [
    "int">: T.int32,
    "float">: T.float32]

testTypeSimpleNumberNameDef :: TBinding Name
testTypeSimpleNumberNameDef = testGraphDefinition "testTypeSimpleNumberName" $
  name "SimpleNumber"

testTypeTimestampDef :: TBinding Type
testTypeTimestampDef = testGraphType "testTypeTimestamp" $
  T.union (ref testTypeTimestampNameDef) [
    "unixTimeMillis">: T.uint64,
    "date">: T.string]

testTypeTimestampNameDef :: TBinding Name
testTypeTimestampNameDef = testGraphDefinition "testTypeTimestampName" $
  name "Timestamp"

testTypeUnionMonomorphicDef :: TBinding Type
testTypeUnionMonomorphicDef = testGraphType "testTypeUnionMonomorphic" $
  T.union (ref testTypeUnionMonomorphicNameDef) [
    "bool">: T.boolean,
    "string">: T.string,
    "unit">: T.unit]

testTypeUnionMonomorphicNameDef :: TBinding Name
testTypeUnionMonomorphicNameDef = testGraphDefinition "testTypeUnionMonomorphicName" $
  name "UnionMonomorphic"

testTypeUnionPolymorphicRecursiveDef :: TBinding Type
testTypeUnionPolymorphicRecursiveDef = testGraphType "testTypeUnionPolymorphicRecursive" $
  T.forAll "a" $ T.union (ref testTypeUnionPolymorphicRecursiveNameDef) [
    "bool">: T.boolean,
    "value">: T.var "a",
    "other">: T.apply (Core.typeVariable $ ref testTypeUnionPolymorphicRecursiveNameDef) (T.var "a")]

testTypeUnionPolymorphicRecursiveNameDef :: TBinding Name
testTypeUnionPolymorphicRecursiveNameDef = testGraphDefinition "testTypeUnionPolymorphicRecursiveName" $
  name "UnionPolymorphicRecursive"

testTypeUnitDef :: TBinding Type
testTypeUnitDef = testGraphType "testTypeUnit" $
  T.record (ref testTypeUnitNameDef) []

testTypeUnitNameDef :: TBinding Name
testTypeUnitNameDef = testGraphDefinition "testTypeUnitName" $
  name "Unit"