hydra-0.13.0: src/gen-main/haskell/Hydra/Reflect.hs
-- Note: this is an automatically generated file. Do not edit.
-- | Reflection functions for working with term, type, and literal type variants, as well as numeric precision.
module Hydra.Reflect where
import qualified Hydra.Core as Core
import qualified Hydra.Lib.Lists as Lists
import qualified Hydra.Util as Util
import qualified Hydra.Variants as Variants
import Prelude hiding (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
import qualified Data.ByteString as B
import qualified Data.Int as I
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Set as S
-- | Find the elimination inject (constructor) for a given elimination term
eliminationVariant :: (Core.Elimination -> Variants.EliminationVariant)
eliminationVariant x = case x of
Core.EliminationRecord _ -> Variants.EliminationVariantRecord
Core.EliminationUnion _ -> Variants.EliminationVariantUnion
Core.EliminationWrap _ -> Variants.EliminationVariantWrap
-- | All elimination variants (constructors), in a canonical order
eliminationVariants :: [Variants.EliminationVariant]
eliminationVariants = [
Variants.EliminationVariantRecord,
Variants.EliminationVariantUnion,
Variants.EliminationVariantWrap]
-- | Find the precision of a given floating-point type
floatTypePrecision :: (Core.FloatType -> Util.Precision)
floatTypePrecision x = case x of
Core.FloatTypeBigfloat -> Util.PrecisionArbitrary
Core.FloatTypeFloat32 -> (Util.PrecisionBits 32)
Core.FloatTypeFloat64 -> (Util.PrecisionBits 64)
-- | All floating-point types in a canonical order
floatTypes :: [Core.FloatType]
floatTypes = [
Core.FloatTypeBigfloat,
Core.FloatTypeFloat32,
Core.FloatTypeFloat64]
-- | Find the float type for a given floating-point value
floatValueType :: (Core.FloatValue -> Core.FloatType)
floatValueType x = case x of
Core.FloatValueBigfloat _ -> Core.FloatTypeBigfloat
Core.FloatValueFloat32 _ -> Core.FloatTypeFloat32
Core.FloatValueFloat64 _ -> Core.FloatTypeFloat64
-- | Find the function inject (constructor) for a given function
functionVariant :: (Core.Function -> Variants.FunctionVariant)
functionVariant x = case x of
Core.FunctionElimination _ -> Variants.FunctionVariantElimination
Core.FunctionLambda _ -> Variants.FunctionVariantLambda
Core.FunctionPrimitive _ -> Variants.FunctionVariantPrimitive
-- | All function variants (constructors), in a canonical order
functionVariants :: [Variants.FunctionVariant]
functionVariants = [
Variants.FunctionVariantElimination,
Variants.FunctionVariantLambda,
Variants.FunctionVariantPrimitive]
-- | Find whether a given integer type is signed (true) or unsigned (false)
integerTypeIsSigned :: (Core.IntegerType -> Bool)
integerTypeIsSigned x = case x of
Core.IntegerTypeBigint -> True
Core.IntegerTypeInt8 -> True
Core.IntegerTypeInt16 -> True
Core.IntegerTypeInt32 -> True
Core.IntegerTypeInt64 -> True
Core.IntegerTypeUint8 -> False
Core.IntegerTypeUint16 -> False
Core.IntegerTypeUint32 -> False
Core.IntegerTypeUint64 -> False
-- | Find the precision of a given integer type
integerTypePrecision :: (Core.IntegerType -> Util.Precision)
integerTypePrecision x = case x of
Core.IntegerTypeBigint -> Util.PrecisionArbitrary
Core.IntegerTypeInt8 -> (Util.PrecisionBits 8)
Core.IntegerTypeInt16 -> (Util.PrecisionBits 16)
Core.IntegerTypeInt32 -> (Util.PrecisionBits 32)
Core.IntegerTypeInt64 -> (Util.PrecisionBits 64)
Core.IntegerTypeUint8 -> (Util.PrecisionBits 8)
Core.IntegerTypeUint16 -> (Util.PrecisionBits 16)
Core.IntegerTypeUint32 -> (Util.PrecisionBits 32)
Core.IntegerTypeUint64 -> (Util.PrecisionBits 64)
-- | All integer types, in a canonical order
integerTypes :: [Core.IntegerType]
integerTypes = [
Core.IntegerTypeBigint,
Core.IntegerTypeInt8,
Core.IntegerTypeInt16,
Core.IntegerTypeInt32,
Core.IntegerTypeInt64,
Core.IntegerTypeUint8,
Core.IntegerTypeUint16,
Core.IntegerTypeUint32,
Core.IntegerTypeUint64]
-- | Find the integer type for a given integer value
integerValueType :: (Core.IntegerValue -> Core.IntegerType)
integerValueType x = case x of
Core.IntegerValueBigint _ -> Core.IntegerTypeBigint
Core.IntegerValueInt8 _ -> Core.IntegerTypeInt8
Core.IntegerValueInt16 _ -> Core.IntegerTypeInt16
Core.IntegerValueInt32 _ -> Core.IntegerTypeInt32
Core.IntegerValueInt64 _ -> Core.IntegerTypeInt64
Core.IntegerValueUint8 _ -> Core.IntegerTypeUint8
Core.IntegerValueUint16 _ -> Core.IntegerTypeUint16
Core.IntegerValueUint32 _ -> Core.IntegerTypeUint32
Core.IntegerValueUint64 _ -> Core.IntegerTypeUint64
-- | Find the literal type for a given literal value
literalType :: (Core.Literal -> Core.LiteralType)
literalType x = case x of
Core.LiteralBinary _ -> Core.LiteralTypeBinary
Core.LiteralBoolean _ -> Core.LiteralTypeBoolean
Core.LiteralFloat v1 -> ((\injected_ -> Core.LiteralTypeFloat injected_) (floatValueType v1))
Core.LiteralInteger v1 -> ((\injected_ -> Core.LiteralTypeInteger injected_) (integerValueType v1))
Core.LiteralString _ -> Core.LiteralTypeString
-- | Find the literal type inject (constructor) for a given literal value
literalTypeVariant :: (Core.LiteralType -> Variants.LiteralVariant)
literalTypeVariant x = case x of
Core.LiteralTypeBinary -> Variants.LiteralVariantBinary
Core.LiteralTypeBoolean -> Variants.LiteralVariantBoolean
Core.LiteralTypeFloat _ -> Variants.LiteralVariantFloat
Core.LiteralTypeInteger _ -> Variants.LiteralVariantInteger
Core.LiteralTypeString -> Variants.LiteralVariantString
-- | All literal types, in a canonical order
literalTypes :: [Core.LiteralType]
literalTypes = (Lists.concat [
[
Core.LiteralTypeBinary,
Core.LiteralTypeBoolean],
(Lists.map (\x -> Core.LiteralTypeFloat x) floatTypes),
(Lists.map (\x -> Core.LiteralTypeInteger x) integerTypes),
[
Core.LiteralTypeString]])
-- | Find the literal inject (constructor) for a given literal value
literalVariant :: (Core.Literal -> Variants.LiteralVariant)
literalVariant arg_ = (literalTypeVariant (literalType arg_))
-- | All literal variants, in a canonical order
literalVariants :: [Variants.LiteralVariant]
literalVariants = [
Variants.LiteralVariantBinary,
Variants.LiteralVariantBoolean,
Variants.LiteralVariantFloat,
Variants.LiteralVariantInteger,
Variants.LiteralVariantString]
-- | Find the term inject (constructor) for a given term
termVariant :: (Core.Term -> Variants.TermVariant)
termVariant x = case x of
Core.TermAnnotated _ -> Variants.TermVariantAnnotated
Core.TermApplication _ -> Variants.TermVariantApplication
Core.TermEither _ -> Variants.TermVariantEither
Core.TermFunction _ -> Variants.TermVariantFunction
Core.TermLet _ -> Variants.TermVariantLet
Core.TermList _ -> Variants.TermVariantList
Core.TermLiteral _ -> Variants.TermVariantLiteral
Core.TermMap _ -> Variants.TermVariantMap
Core.TermMaybe _ -> Variants.TermVariantMaybe
Core.TermPair _ -> Variants.TermVariantPair
Core.TermRecord _ -> Variants.TermVariantRecord
Core.TermSet _ -> Variants.TermVariantSet
Core.TermTypeApplication _ -> Variants.TermVariantTypeApplication
Core.TermTypeLambda _ -> Variants.TermVariantTypeLambda
Core.TermUnion _ -> Variants.TermVariantUnion
Core.TermUnit -> Variants.TermVariantUnit
Core.TermVariable _ -> Variants.TermVariantVariable
Core.TermWrap _ -> Variants.TermVariantWrap
-- | All term (expression) variants, in a canonical order
termVariants :: [Variants.TermVariant]
termVariants = [
Variants.TermVariantAnnotated,
Variants.TermVariantApplication,
Variants.TermVariantEither,
Variants.TermVariantFunction,
Variants.TermVariantList,
Variants.TermVariantLiteral,
Variants.TermVariantMap,
Variants.TermVariantMaybe,
Variants.TermVariantPair,
Variants.TermVariantRecord,
Variants.TermVariantSet,
Variants.TermVariantTypeLambda,
Variants.TermVariantTypeApplication,
Variants.TermVariantUnion,
Variants.TermVariantUnit,
Variants.TermVariantVariable,
Variants.TermVariantWrap]
-- | Find the type inject (constructor) for a given type
typeVariant :: (Core.Type -> Variants.TypeVariant)
typeVariant x = case x of
Core.TypeAnnotated _ -> Variants.TypeVariantAnnotated
Core.TypeApplication _ -> Variants.TypeVariantApplication
Core.TypeEither _ -> Variants.TypeVariantEither
Core.TypeFunction _ -> Variants.TypeVariantFunction
Core.TypeForall _ -> Variants.TypeVariantForall
Core.TypeList _ -> Variants.TypeVariantList
Core.TypeLiteral _ -> Variants.TypeVariantLiteral
Core.TypeMap _ -> Variants.TypeVariantMap
Core.TypeMaybe _ -> Variants.TypeVariantMaybe
Core.TypePair _ -> Variants.TypeVariantPair
Core.TypeRecord _ -> Variants.TypeVariantRecord
Core.TypeSet _ -> Variants.TypeVariantSet
Core.TypeUnion _ -> Variants.TypeVariantUnion
Core.TypeUnit -> Variants.TypeVariantUnit
Core.TypeVariable _ -> Variants.TypeVariantVariable
Core.TypeWrap _ -> Variants.TypeVariantWrap
-- | All type variants, in a canonical order
typeVariants :: [Variants.TypeVariant]
typeVariants = [
Variants.TypeVariantAnnotated,
Variants.TypeVariantApplication,
Variants.TypeVariantEither,
Variants.TypeVariantFunction,
Variants.TypeVariantForall,
Variants.TypeVariantList,
Variants.TypeVariantLiteral,
Variants.TypeVariantMap,
Variants.TypeVariantWrap,
Variants.TypeVariantMaybe,
Variants.TypeVariantPair,
Variants.TypeVariantRecord,
Variants.TypeVariantSet,
Variants.TypeVariantUnion,
Variants.TypeVariantUnit,
Variants.TypeVariantVariable]