module Hydra.Langs.Haskell.Language where

import Hydra.Kernel

import qualified Data.Set as S


haskellLanguage :: Language
haskellLanguage :: Language
haskellLanguage = LanguageName -> LanguageConstraints -> Language
Language (String -> LanguageName
LanguageName String
"hydra/langs/haskell") (LanguageConstraints -> Language)
-> LanguageConstraints -> Language
forall a b. (a -> b) -> a -> b
$ LanguageConstraints {
  languageConstraintsEliminationVariants :: Set EliminationVariant
languageConstraintsEliminationVariants = [EliminationVariant] -> Set EliminationVariant
forall a. Ord a => [a] -> Set a
S.fromList [EliminationVariant]
eliminationVariants,
  languageConstraintsLiteralVariants :: Set LiteralVariant
languageConstraintsLiteralVariants = [LiteralVariant] -> Set LiteralVariant
forall a. Ord a => [a] -> Set a
S.fromList [
    LiteralVariant
LiteralVariantBoolean,
    LiteralVariant
LiteralVariantFloat,
    LiteralVariant
LiteralVariantInteger,
    LiteralVariant
LiteralVariantString],
  languageConstraintsFloatTypes :: Set FloatType
languageConstraintsFloatTypes = [FloatType] -> Set FloatType
forall a. Ord a => [a] -> Set a
S.fromList [
    -- Bigfloat is excluded for now
    FloatType
FloatTypeFloat32, -- Float
    FloatType
FloatTypeFloat64], -- Double
  languageConstraintsFunctionVariants :: Set FunctionVariant
languageConstraintsFunctionVariants = [FunctionVariant] -> Set FunctionVariant
forall a. Ord a => [a] -> Set a
S.fromList [FunctionVariant]
functionVariants,
  languageConstraintsIntegerTypes :: Set IntegerType
languageConstraintsIntegerTypes = [IntegerType] -> Set IntegerType
forall a. Ord a => [a] -> Set a
S.fromList [
    IntegerType
IntegerTypeBigint, -- Integer
    IntegerType
IntegerTypeInt8, -- Int8
    IntegerType
IntegerTypeInt16, -- Int16
    IntegerType
IntegerTypeInt32, -- Int
    IntegerType
IntegerTypeInt64], -- Int64
  languageConstraintsTermVariants :: Set TermVariant
languageConstraintsTermVariants = [TermVariant] -> Set TermVariant
forall a. Ord a => [a] -> Set a
S.fromList [
    TermVariant
TermVariantApplication,
    TermVariant
TermVariantFunction,
    TermVariant
TermVariantLet,
    TermVariant
TermVariantList,
    TermVariant
TermVariantLiteral,
    TermVariant
TermVariantMap,
    TermVariant
TermVariantOptional,
    TermVariant
TermVariantProduct,
    TermVariant
TermVariantRecord,
    TermVariant
TermVariantSet,
    TermVariant
TermVariantUnion,
    TermVariant
TermVariantVariable,
    TermVariant
TermVariantWrap],
  languageConstraintsTypeVariants :: Set TypeVariant
languageConstraintsTypeVariants = [TypeVariant] -> Set TypeVariant
forall a. Ord a => [a] -> Set a
S.fromList [
    TypeVariant
TypeVariantAnnotated,
    TypeVariant
TypeVariantApplication,
    TypeVariant
TypeVariantFunction,
    TypeVariant
TypeVariantLambda,
    TypeVariant
TypeVariantList,
    TypeVariant
TypeVariantLiteral,
    TypeVariant
TypeVariantMap,
    TypeVariant
TypeVariantOptional,
    TypeVariant
TypeVariantProduct,
    TypeVariant
TypeVariantRecord,
    TypeVariant
TypeVariantSet,
    TypeVariant
TypeVariantUnion,
    TypeVariant
TypeVariantVariable,
    TypeVariant
TypeVariantWrap],
  languageConstraintsTypes :: Type -> Bool
languageConstraintsTypes = Bool -> Type -> Bool
forall a b. a -> b -> a
const Bool
True }

reservedWords :: S.Set String
reservedWords :: Set String
reservedWords = [String] -> Set String
forall a. Ord a => [a] -> Set a
S.fromList ([String] -> Set String) -> [String] -> Set String
forall a b. (a -> b) -> a -> b
$ [String]
preludeSymbols [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
extSymbols
  where
    -- See: https://www.haskell.org/onlinereport/standard-prelude.html
    -- List created on 2022-06-01. Symbols not containing at least one alphanumeric character are excluded.
    preludeSymbols :: [String]
preludeSymbols = [
      String
"Bool", String
"Bounded", String
"Char", String
"Double", String
"EQ", String
"Either", String
"Enum", String
"Eq", String
"False", String
"Float", String
"Floating", String
"Fractional",
      String
"Functor", String
"GT", String
"IO", String
"Int", String
"Integer", String
"Integral", String
"Just", String
"LT", String
"Left", String
"Maybe", String
"Monad", String
"Nothing", String
"Num",
      String
"Ord", String
"Ordering", String
"Rational", String
"Real", String
"RealFloat", String
"RealFrac", String
"Right", String
"String", String
"True", String
"abs", String
"acos", String
"acosh",
      String
"asTypeOf", String
"asin", String
"asinh", String
"atan", String
"atan2", String
"atanh", String
"ceiling", String
"compare", String
"const", String
"cos", String
"cosh", String
"curry",
      String
"decodeFloat", String
"div", String
"divMod", String
"either", String
"encodeFloat", String
"enumFrom", String
"enumFromThen", String
"enumFromThenTo",
      String
"enumFromTo", String
"error", String
"even", String
"exp", String
"exponent", String
"fail", String
"flip", String
"floatDigits", String
"floatRadix", String
"floatRange",
      String
"floor", String
"fmap", String
"fromEnum", String
"fromInteger", String
"fromIntegral", String
"fromRational", String
"fst", String
"gcd", String
"id", String
"isDenormalized",
      String
"isIEEE", String
"isInfinite", String
"isNaN", String
"isNegativeZero", String
"lcm", String
"log", String
"logBase", String
"mapM", String
"mapM_", String
"max", String
"maxBound",
      String
"maybe", String
"min", String
"minBound", String
"mod", String
"negate", String
"not", String
"odd", String
"otherwise", String
"pi", String
"pred", String
"properFraction", String
"quot",
      String
"quotRem", String
"realToFrac", String
"recip", String
"rem", String
"return", String
"round", String
"scaleFloat", String
"seq", String
"sequence", String
"sequence_",
      String
"significand", String
"signum", String
"sin", String
"sinh", String
"snd", String
"sqrt", String
"subtract", String
"succ", String
"tan", String
"tanh", String
"toEnum", String
"toInteger",
      String
"toRational", String
"truncate", String
"uncurry", String
"undefined", String
"until"]
    -- Additional symbols which need to be reserved, as the Haskell coder uses them in their unqualified form
    extSymbols :: [String]
extSymbols = [String
"Map", String
"Set"]