module Hydra.CoreEncoding where import Hydra.Core import Hydra.Compute import Hydra.Mantle import Hydra.Monads import Hydra.Impl.Haskell.Dsl.Terms import Prelude hiding (map) import qualified Data.Map as M import qualified Data.Set as S encodeApplication :: Ord m => Application m -> Term m encodeApplication :: forall m. Ord m => Application m -> Term m encodeApplication (Application Term m lhs Term m rhs) = forall m. Name -> [Field m] -> Term m record Name _Application [ forall m. FieldName -> Term m -> Field m Field FieldName _Application_function forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m lhs, forall m. FieldName -> Term m -> Field m Field FieldName _Application_argument forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m rhs] encodeApplicationType :: ApplicationType m -> Term m encodeApplicationType :: forall m. ApplicationType m -> Term m encodeApplicationType (ApplicationType Type m lhs Type m rhs) = forall m. Name -> [Field m] -> Term m record Name _ApplicationType [ forall m. FieldName -> Term m -> Field m Field FieldName _ApplicationType_function forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m lhs, forall m. FieldName -> Term m -> Field m Field FieldName _ApplicationType_argument forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m rhs] encodeCaseStatement :: Ord m => CaseStatement m -> Term m encodeCaseStatement :: forall m. Ord m => CaseStatement m -> Term m encodeCaseStatement (CaseStatement Name name [Field m] cases) = forall m. Name -> [Field m] -> Term m record Name _CaseStatement [ forall m. FieldName -> Term m -> Field m Field FieldName _CaseStatement_typeName forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string (Name -> String unName Name name), forall m. FieldName -> Term m -> Field m Field FieldName _CaseStatement_cases forall a b. (a -> b) -> a -> b $ forall m. [Term m] -> Term m list forall a b. (a -> b) -> a -> b $ forall m. Ord m => Field m -> Term m encodeField forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [Field m] cases] encodeElimination :: Ord m => Elimination m -> Term m encodeElimination :: forall m. Ord m => Elimination m -> Term m encodeElimination Elimination m e = case Elimination m e of Elimination m EliminationElement -> forall m. Name -> FieldName -> Term m unitVariant Name _Elimination FieldName _Elimination_element EliminationList Term m f -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Elimination FieldName _Elimination_list forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m f EliminationNominal (Name String name) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Elimination FieldName _Elimination_nominal forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String name EliminationOptional OptionalCases m cases -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Elimination FieldName _Elimination_optional forall a b. (a -> b) -> a -> b $ forall m. Ord m => OptionalCases m -> Term m encodeOptionalCases OptionalCases m cases EliminationRecord Projection p -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Elimination FieldName _Elimination_record forall a b. (a -> b) -> a -> b $ forall m. Projection -> Term m encodeProjection Projection p EliminationUnion CaseStatement m c -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Elimination FieldName _Elimination_union forall a b. (a -> b) -> a -> b $ forall m. Ord m => CaseStatement m -> Term m encodeCaseStatement CaseStatement m c encodeField :: Ord m => Field m -> Term m encodeField :: forall m. Ord m => Field m -> Term m encodeField (Field (FieldName String name) Term m term) = forall m. Name -> [Field m] -> Term m record Name _Field [ forall m. FieldName -> Term m -> Field m Field FieldName _Field_name forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String name, forall m. FieldName -> Term m -> Field m Field FieldName _Field_term forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m term] encodeFieldType :: FieldType m -> Term m encodeFieldType :: forall m. FieldType m -> Term m encodeFieldType (FieldType (FieldName String fname) Type m t) = forall m. Name -> [Field m] -> Term m record Name _FieldType [ forall m. FieldName -> Term m -> Field m Field FieldName _FieldType_name forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String fname, forall m. FieldName -> Term m -> Field m Field FieldName _FieldType_type forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m t] encodeFloatType :: FloatType -> Term m encodeFloatType :: forall m. FloatType -> Term m encodeFloatType FloatType ft = forall m. Name -> FieldName -> Term m unitVariant Name _FloatType forall a b. (a -> b) -> a -> b $ case FloatType ft of FloatType FloatTypeBigfloat -> FieldName _FloatType_bigfloat FloatType FloatTypeFloat32 -> FieldName _FloatType_float32 FloatType FloatTypeFloat64 -> FieldName _FloatType_float64 encodeFunction :: Ord m => Function m -> Term m encodeFunction :: forall m. Ord m => Function m -> Term m encodeFunction Function m f = case Function m f of FunctionCompareTo Term m other -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Function FieldName _Function_compareTo forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m other FunctionElimination Elimination m e -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Function FieldName _Function_compareTo forall a b. (a -> b) -> a -> b $ forall m. Ord m => Elimination m -> Term m encodeElimination Elimination m e FunctionLambda Lambda m l -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Function FieldName _Function_lambda forall a b. (a -> b) -> a -> b $ forall m. Ord m => Lambda m -> Term m encodeLambda Lambda m l FunctionPrimitive (Name String name) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Function FieldName _Function_primitive forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String name encodeFunctionType :: FunctionType m -> Term m encodeFunctionType :: forall m. FunctionType m -> Term m encodeFunctionType (FunctionType Type m dom Type m cod) = forall m. Name -> [Field m] -> Term m record Name _FunctionType [ forall m. FieldName -> Term m -> Field m Field FieldName _FunctionType_domain forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m dom, forall m. FieldName -> Term m -> Field m Field FieldName _FunctionType_codomain forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m cod] encodeIntegerType :: IntegerType -> Term m encodeIntegerType :: forall m. IntegerType -> Term m encodeIntegerType IntegerType it = forall m. Name -> FieldName -> Term m unitVariant Name _IntegerType forall a b. (a -> b) -> a -> b $ case IntegerType it of IntegerType IntegerTypeBigint -> FieldName _IntegerType_bigint IntegerType IntegerTypeInt8 -> FieldName _IntegerType_int8 IntegerType IntegerTypeInt16 -> FieldName _IntegerType_int16 IntegerType IntegerTypeInt32 -> FieldName _IntegerType_int32 IntegerType IntegerTypeInt64 -> FieldName _IntegerType_int64 IntegerType IntegerTypeUint8 -> FieldName _IntegerType_uint8 IntegerType IntegerTypeUint16 -> FieldName _IntegerType_uint16 IntegerType IntegerTypeUint32 -> FieldName _IntegerType_uint32 IntegerType IntegerTypeUint64 -> FieldName _IntegerType_uint64 encodeLambda :: Ord m => Lambda m -> Term m encodeLambda :: forall m. Ord m => Lambda m -> Term m encodeLambda (Lambda (Variable String v) Term m b) = forall m. Name -> [Field m] -> Term m record Name _Lambda [ forall m. FieldName -> Term m -> Field m Field FieldName _Lambda_parameter forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String v, forall m. FieldName -> Term m -> Field m Field FieldName _Lambda_body forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m b] encodeLambdaType :: LambdaType m -> Term m encodeLambdaType :: forall m. LambdaType m -> Term m encodeLambdaType (LambdaType (VariableType String var) Type m body) = forall m. Name -> [Field m] -> Term m record Name _LambdaType [ forall m. FieldName -> Term m -> Field m Field FieldName _LambdaType_parameter forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String var, forall m. FieldName -> Term m -> Field m Field FieldName _LambdaType_body forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m body] encodeLiteralType :: LiteralType -> Term m encodeLiteralType :: forall m. LiteralType -> Term m encodeLiteralType LiteralType at = case LiteralType at of LiteralType LiteralTypeBinary -> forall m. Name -> FieldName -> Term m unitVariant Name _LiteralType FieldName _LiteralType_binary LiteralType LiteralTypeBoolean -> forall m. Name -> FieldName -> Term m unitVariant Name _LiteralType FieldName _LiteralType_boolean LiteralTypeFloat FloatType ft -> forall m. Name -> FieldName -> Term m -> Term m variant Name _LiteralType FieldName _LiteralType_float forall a b. (a -> b) -> a -> b $ forall m. FloatType -> Term m encodeFloatType FloatType ft LiteralTypeInteger IntegerType it -> forall m. Name -> FieldName -> Term m -> Term m variant Name _LiteralType FieldName _LiteralType_integer forall a b. (a -> b) -> a -> b $ forall m. IntegerType -> Term m encodeIntegerType IntegerType it LiteralType LiteralTypeString -> forall m. Name -> FieldName -> Term m unitVariant Name _LiteralType FieldName _LiteralType_string encodeLiteral :: Literal -> Term m encodeLiteral :: forall m. Literal -> Term m encodeLiteral = forall m. Literal -> Term m literal encodeLiteralVariant :: LiteralVariant -> Term m encodeLiteralVariant :: forall m. LiteralVariant -> Term m encodeLiteralVariant LiteralVariant av = forall m. Name -> FieldName -> Term m unitVariant Name _LiteralVariant forall a b. (a -> b) -> a -> b $ case LiteralVariant av of LiteralVariant LiteralVariantBinary -> FieldName _LiteralVariant_binary LiteralVariant LiteralVariantBoolean -> FieldName _LiteralVariant_boolean LiteralVariant LiteralVariantFloat -> FieldName _LiteralVariant_float LiteralVariant LiteralVariantInteger -> FieldName _LiteralVariant_integer LiteralVariant LiteralVariantString -> FieldName _LiteralVariant_string encodeMapType :: MapType m -> Term m encodeMapType :: forall m. MapType m -> Term m encodeMapType (MapType Type m kt Type m vt) = forall m. Name -> [Field m] -> Term m record Name _MapType [ forall m. FieldName -> Term m -> Field m Field FieldName _MapType_keys forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m kt, forall m. FieldName -> Term m -> Field m Field FieldName _MapType_values forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m vt] encodeNamed :: Ord m => Named m -> Term m encodeNamed :: forall m. Ord m => Named m -> Term m encodeNamed (Named (Name String name) Term m term) = forall m. Name -> [Field m] -> Term m record Name _Named [ forall m. FieldName -> Term m -> Field m Field FieldName _Named_typeName forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String name, forall m. FieldName -> Term m -> Field m Field FieldName _Named_term forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m term] encodeOptionalCases :: Ord m => OptionalCases m -> Term m encodeOptionalCases :: forall m. Ord m => OptionalCases m -> Term m encodeOptionalCases (OptionalCases Term m nothing Term m just) = forall m. Name -> [Field m] -> Term m record Name _OptionalCases [ forall m. FieldName -> Term m -> Field m Field FieldName _OptionalCases_nothing forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m nothing, forall m. FieldName -> Term m -> Field m Field FieldName _OptionalCases_just forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m just] encodeProjection :: Projection -> Term m encodeProjection :: forall m. Projection -> Term m encodeProjection (Projection Name name FieldName fname) = forall m. Name -> [Field m] -> Term m record Name _Projection [ forall m. FieldName -> Term m -> Field m Field FieldName _Projection_typeName forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string (Name -> String unName Name name), forall m. FieldName -> Term m -> Field m Field FieldName _Projection_field forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string (FieldName -> String unFieldName FieldName fname)] encodeRowType :: RowType m -> Term m encodeRowType :: forall m. RowType m -> Term m encodeRowType (RowType Name name Maybe Name extends [FieldType m] fields) = forall m. Name -> [Field m] -> Term m record Name _RowType [ forall m. FieldName -> Term m -> Field m Field FieldName _RowType_typeName forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string (Name -> String unName Name name), forall m. FieldName -> Term m -> Field m Field FieldName _RowType_extends forall a b. (a -> b) -> a -> b $ forall m. Maybe (Term m) -> Term m optional (forall m. String -> Term m string forall b c a. (b -> c) -> (a -> b) -> a -> c . Name -> String unName forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe Name extends), forall m. FieldName -> Term m -> Field m Field FieldName _RowType_fields forall a b. (a -> b) -> a -> b $ forall m. [Term m] -> Term m list forall a b. (a -> b) -> a -> b $ forall m. FieldType m -> Term m encodeFieldType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [FieldType m] fields] encodeSum :: Ord m => Sum m -> Term m encodeSum :: forall m. Ord m => Sum m -> Term m encodeSum (Sum Int i Int l Term m term) = forall m. Name -> [Field m] -> Term m record Name _Sum [ forall m. FieldName -> Term m -> Field m Field FieldName _Sum_index forall a b. (a -> b) -> a -> b $ forall m. Int -> Term m int32 Int i, forall m. FieldName -> Term m -> Field m Field FieldName _Sum_size forall a b. (a -> b) -> a -> b $ forall m. Int -> Term m int32 Int l, forall m. FieldName -> Term m -> Field m Field FieldName _Sum_term forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm Term m term] encodeTerm :: Ord m => Term m -> Term m encodeTerm :: forall m. Ord m => Term m -> Term m encodeTerm Term m term = case Term m term of TermAnnotated (Annotated Term m t m ann) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_annotated forall a b. (a -> b) -> a -> b $ forall m. Annotated (Term m) m -> Term m TermAnnotated forall a b. (a -> b) -> a -> b $ forall a m. a -> m -> Annotated a m Annotated (forall m. Ord m => Term m -> Term m encodeTerm Term m t) m ann TermApplication Application m a -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_application forall a b. (a -> b) -> a -> b $ forall m. Ord m => Application m -> Term m encodeApplication Application m a TermLiteral Literal av -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_literal forall a b. (a -> b) -> a -> b $ forall m. Literal -> Term m encodeLiteral Literal av TermElement (Name String name) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_element forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String name TermFunction Function m f -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_function forall a b. (a -> b) -> a -> b $ forall m. Ord m => Function m -> Term m encodeFunction Function m f TermList [Term m] terms -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_list forall a b. (a -> b) -> a -> b $ forall m. [Term m] -> Term m list forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [Term m] terms TermMap Map (Term m) (Term m) m -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_map forall a b. (a -> b) -> a -> b $ forall m. Map (Term m) (Term m) -> Term m map forall a b. (a -> b) -> a -> b $ forall k a. Ord k => [(k, a)] -> Map k a M.fromList forall a b. (a -> b) -> a -> b $ forall {m} {m}. (Ord m, Ord m) => (Term m, Term m) -> (Term m, Term m) encodePair forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall k a. Map k a -> [(k, a)] M.toList Map (Term m) (Term m) m where encodePair :: (Term m, Term m) -> (Term m, Term m) encodePair (Term m k, Term m v) = (forall m. Ord m => Term m -> Term m encodeTerm Term m k, forall m. Ord m => Term m -> Term m encodeTerm Term m v) TermNominal Named m ntt -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_nominal forall a b. (a -> b) -> a -> b $ forall m. Ord m => Named m -> Term m encodeNamed Named m ntt TermOptional Maybe (Term m) m -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_optional forall a b. (a -> b) -> a -> b $ forall m. Maybe (Term m) -> Term m optional forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe (Term m) m TermProduct [Term m] terms -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_product forall a b. (a -> b) -> a -> b $ forall m. [Term m] -> Term m list (forall m. Ord m => Term m -> Term m encodeTerm forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [Term m] terms) TermRecord (Record Name _ [Field m] fields) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_record forall a b. (a -> b) -> a -> b $ forall m. [Term m] -> Term m list forall a b. (a -> b) -> a -> b $ forall m. Ord m => Field m -> Term m encodeField forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [Field m] fields TermSet Set (Term m) terms -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_set forall a b. (a -> b) -> a -> b $ forall m. Set (Term m) -> Term m set forall a b. (a -> b) -> a -> b $ forall a. Ord a => [a] -> Set a S.fromList forall a b. (a -> b) -> a -> b $ forall m. Ord m => Term m -> Term m encodeTerm forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall a. Set a -> [a] S.toList Set (Term m) terms TermSum Sum m s -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_sum forall a b. (a -> b) -> a -> b $ forall m. Ord m => Sum m -> Term m encodeSum Sum m s TermUnion (Union Name _ Field m field) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_union forall a b. (a -> b) -> a -> b $ forall m. Ord m => Field m -> Term m encodeField Field m field TermVariable (Variable String var) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Term FieldName _Term_variable forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String var encodeType :: Type m -> Term m encodeType :: forall m. Type m -> Term m encodeType Type m typ = case Type m typ of TypeAnnotated (Annotated Type m t m ann) -> forall m. Annotated (Term m) m -> Term m TermAnnotated (forall a m. a -> m -> Annotated a m Annotated (forall m. Type m -> Term m encodeType Type m t) m ann) TypeApplication ApplicationType m a -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_application forall a b. (a -> b) -> a -> b $ forall m. ApplicationType m -> Term m encodeApplicationType ApplicationType m a TypeElement Type m t -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_element forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m t TypeFunction FunctionType m ft -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_function forall a b. (a -> b) -> a -> b $ forall m. FunctionType m -> Term m encodeFunctionType FunctionType m ft TypeLambda LambdaType m ut -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_lambda forall a b. (a -> b) -> a -> b $ forall m. LambdaType m -> Term m encodeLambdaType LambdaType m ut TypeList Type m t -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_list forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m t TypeLiteral LiteralType at -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_literal forall a b. (a -> b) -> a -> b $ forall m. LiteralType -> Term m encodeLiteralType LiteralType at TypeMap MapType m mt -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_map forall a b. (a -> b) -> a -> b $ forall m. MapType m -> Term m encodeMapType MapType m mt TypeNominal Name name -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_nominal forall a b. (a -> b) -> a -> b $ forall m. Name -> Term m element Name name TypeOptional Type m t -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_optional forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m t TypeProduct [Type m] types -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_product forall a b. (a -> b) -> a -> b $ forall m. [Term m] -> Term m list (forall m. Type m -> Term m encodeType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [Type m] types) TypeRecord RowType m rt -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_record forall a b. (a -> b) -> a -> b $ forall m. RowType m -> Term m encodeRowType RowType m rt TypeSet Type m t -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_set forall a b. (a -> b) -> a -> b $ forall m. Type m -> Term m encodeType Type m t TypeSum [Type m] types -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_sum forall a b. (a -> b) -> a -> b $ forall m. [Term m] -> Term m list (forall m. Type m -> Term m encodeType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [Type m] types) TypeUnion RowType m rt -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_union forall a b. (a -> b) -> a -> b $ forall m. RowType m -> Term m encodeRowType RowType m rt TypeVariable (VariableType String var) -> forall m. Name -> FieldName -> Term m -> Term m variant Name _Type FieldName _Type_variable forall a b. (a -> b) -> a -> b $ forall m. String -> Term m string String var encodeTypeVariant :: TypeVariant -> Term m encodeTypeVariant :: forall m. TypeVariant -> Term m encodeTypeVariant TypeVariant tv = forall m. Name -> FieldName -> Term m unitVariant Name _TypeVariant forall a b. (a -> b) -> a -> b $ case TypeVariant tv of TypeVariant TypeVariantAnnotated -> FieldName _TypeVariant_annotated TypeVariant TypeVariantLiteral -> FieldName _TypeVariant_literal TypeVariant TypeVariantElement -> FieldName _TypeVariant_element TypeVariant TypeVariantFunction -> FieldName _TypeVariant_function TypeVariant TypeVariantList -> FieldName _TypeVariant_list TypeVariant TypeVariantMap -> FieldName _TypeVariant_map TypeVariant TypeVariantNominal -> FieldName _TypeVariant_nominal TypeVariant TypeVariantOptional -> FieldName _TypeVariant_optional TypeVariant TypeVariantProduct -> FieldName _TypeVariant_product TypeVariant TypeVariantRecord -> FieldName _TypeVariant_record TypeVariant TypeVariantSet -> FieldName _TypeVariant_set TypeVariant TypeVariantSum -> FieldName _TypeVariant_sum TypeVariant TypeVariantUnion -> FieldName _TypeVariant_union TypeVariant TypeVariantLambda -> FieldName _TypeVariant_lambda TypeVariant TypeVariantVariable -> FieldName _TypeVariant_variable