hydra-0.15.0: src/main/haskell/Hydra/Scala/Prepare.hs
-- Note: this is an automatically generated file. Do not edit.
-- | Type preparation functions for Scala code generation
module Hydra.Scala.Prepare where
import qualified Hydra.Core as Core
import qualified Hydra.Lib.Literals as Literals
import qualified Hydra.Lib.Pairs as Pairs
import qualified Hydra.Lib.Sets as Sets
import qualified Hydra.Strip as Strip
import qualified Hydra.Rewriting as Rewriting
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
-- | Prepare a literal type for Scala, substituting unsupported types
prepareLiteralType :: Core.LiteralType -> (Core.LiteralType, ((Core.Literal -> Core.Literal), (S.Set String)))
prepareLiteralType at =
case at of
Core.LiteralTypeBinary -> (Core.LiteralTypeString, ((\v -> case v of
Core.LiteralBinary v1 -> Core.LiteralString (Literals.binaryToString v1)
_ -> v), (Sets.fromList [
"replace binary strings with character strings"])))
Core.LiteralTypeFloat v0 ->
let result = prepareFloatType v0
rtyp = Pairs.first result
rep = Pairs.first (Pairs.second result)
msgs = Pairs.second (Pairs.second result)
in (Core.LiteralTypeFloat rtyp, ((\v -> case v of
Core.LiteralFloat v1 -> Core.LiteralFloat (rep v1)
_ -> v), msgs))
Core.LiteralTypeInteger v0 ->
let result = prepareIntegerType v0
rtyp = Pairs.first result
rep = Pairs.first (Pairs.second result)
msgs = Pairs.second (Pairs.second result)
in (Core.LiteralTypeInteger rtyp, ((\v -> case v of
Core.LiteralInteger v1 -> Core.LiteralInteger (rep v1)
_ -> v), msgs))
_ -> same at
-- | Prepare a float type for Scala
prepareFloatType :: Core.FloatType -> (Core.FloatType, ((Core.FloatValue -> Core.FloatValue), (S.Set String)))
prepareFloatType ft =
case ft of
Core.FloatTypeBigfloat -> (Core.FloatTypeFloat64, ((\v -> case v of
Core.FloatValueBigfloat v1 -> Core.FloatValueFloat64 (Literals.bigfloatToFloat64 v1)
_ -> v), (Sets.fromList [
"replace arbitrary-precision floating-point numbers with 64-bit floating-point numbers (doubles)"])))
_ -> same ft
-- | Prepare an integer type for Scala
prepareIntegerType :: Core.IntegerType -> (Core.IntegerType, ((Core.IntegerValue -> Core.IntegerValue), (S.Set String)))
prepareIntegerType it =
case it of
Core.IntegerTypeBigint -> (Core.IntegerTypeInt64, ((\v -> case v of
Core.IntegerValueBigint v1 -> Core.IntegerValueInt64 (Literals.bigintToInt64 v1)
_ -> v), (Sets.fromList [
"replace arbitrary-precision integers with 64-bit integers"])))
Core.IntegerTypeUint8 -> (Core.IntegerTypeInt8, ((\v -> case v of
Core.IntegerValueUint8 v1 -> Core.IntegerValueInt8 (Literals.bigintToInt8 (Literals.uint8ToBigint v1))
_ -> v), (Sets.fromList [
"replace unsigned 8-bit integers with signed 8-bit integers"])))
Core.IntegerTypeUint32 -> (Core.IntegerTypeInt32, ((\v -> case v of
Core.IntegerValueUint32 v1 -> Core.IntegerValueInt32 (Literals.bigintToInt32 (Literals.uint32ToBigint v1))
_ -> v), (Sets.fromList [
"replace unsigned 32-bit integers with signed 32-bit integers"])))
Core.IntegerTypeUint64 -> (Core.IntegerTypeInt64, ((\v -> case v of
Core.IntegerValueUint64 v1 -> Core.IntegerValueInt64 (Literals.bigintToInt64 (Literals.uint64ToBigint v1))
_ -> v), (Sets.fromList [
"replace unsigned 64-bit integers with signed 64-bit integers"])))
_ -> same it
-- | Prepare a type for Scala code generation, substituting unsupported types
prepareType :: t0 -> Core.Type -> (Core.Type, ((Core.Term -> Core.Term), (S.Set String)))
prepareType cx typ =
case (Strip.deannotateType typ) of
Core.TypeLiteral v0 ->
let result = prepareLiteralType v0
rtyp = Pairs.first result
rep = Pairs.first (Pairs.second result)
msgs = Pairs.second (Pairs.second result)
in (Core.TypeLiteral rtyp, ((\v -> case v of
Core.TermLiteral v1 -> Core.TermLiteral (rep v1)
_ -> v), msgs))
_ -> same typ
-- | Return a type unchanged with identity transform and no messages
same :: Ord t2 => (t0 -> (t0, ((t1 -> t1), (S.Set t2))))
same x = (x, ((\y -> y), Sets.empty))