{-# LANGUAGE PatternGuards, RankNTypes, ScopedTypeVariables #-}
module Idris.Primitives(primitives, Prim(..)) where
import Idris.Core.Evaluate
import Idris.Core.TT
import IRTS.Lang
import Data.Bits
import Data.Char
import Data.Function (on)
import Data.Int
data Prim = Prim { Prim -> Name
p_name :: Name,
Prim -> Type
p_type :: Type,
Prim -> Int
p_arity :: Int,
Prim -> [Const] -> Maybe Const
p_def :: [Const] -> Maybe Const,
Prim -> (Int, PrimFn)
p_lexp :: (Int, PrimFn),
Prim -> Totality
p_total :: Totality
}
ty :: [Const] -> Const -> Type
ty :: [Const] -> Const -> Type
ty [] x :: Const
x = Const -> Type
forall n. Const -> TT n
Constant Const
x
ty (t :: Const
t:ts :: [Const]
ts) x :: Const
x = Name -> Binder Type -> Type -> Type
forall n. n -> Binder (TT n) -> TT n -> TT n
Bind (Int -> String -> Name
sMN 0 "T") (RigCount -> Maybe ImplicitInfo -> Type -> Type -> Binder Type
forall b. RigCount -> Maybe ImplicitInfo -> b -> b -> Binder b
Pi RigCount
RigW Maybe ImplicitInfo
forall a. Maybe a
Nothing (Const -> Type
forall n. Const -> TT n
Constant Const
t) (UExp -> Type
forall n. UExp -> TT n
TType (String -> Int -> UExp
UVar [] (-3)))) ([Const] -> Const -> Type
ty [Const]
ts Const
x)
total, partial :: Totality
total :: Totality
total = [Int] -> Totality
Total []
partial :: Totality
partial = PReason -> Totality
Partial PReason
NotCovering
primitives :: [Prim]
primitives :: [Prim]
primitives =
[IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) (NativeTy -> IntTy
ITFixed NativeTy
IT16) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) (NativeTy -> IntTy
ITFixed NativeTy
IT32) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) (NativeTy -> IntTy
ITFixed NativeTy
IT64) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) IntTy
ITBig "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) IntTy
ITNative "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) (NativeTy -> IntTy
ITFixed NativeTy
IT32) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) (NativeTy -> IntTy
ITFixed NativeTy
IT64) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) IntTy
ITBig "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) IntTy
ITNative "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) (NativeTy -> IntTy
ITFixed NativeTy
IT64) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) IntTy
ITBig "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) IntTy
ITNative "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT64) IntTy
ITBig "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative IntTy
ITBig "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT64) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT32) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT16) "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITChar IntTy
ITBig "zext" IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy -> IntTy -> PrimFn
LZExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) (NativeTy -> IntTy
ITFixed NativeTy
IT16) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) (NativeTy -> IntTy
ITFixed NativeTy
IT32) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) (NativeTy -> IntTy
ITFixed NativeTy
IT64) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) IntTy
ITBig "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) IntTy
ITNative "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) (NativeTy -> IntTy
ITFixed NativeTy
IT32) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) (NativeTy -> IntTy
ITFixed NativeTy
IT64) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) IntTy
ITBig "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) IntTy
ITNative "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) (NativeTy -> IntTy
ITFixed NativeTy
IT64) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) IntTy
ITBig "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) IntTy
ITNative "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT64) IntTy
ITBig "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative IntTy
ITBig "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative IntTy
ITBig "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT64) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT32) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT16) "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITChar IntTy
ITBig "sext" IntTy -> IntTy -> [Const] -> Maybe Const
sext IntTy -> IntTy -> PrimFn
LSExt,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) (NativeTy -> IntTy
ITFixed NativeTy
IT8) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) (NativeTy -> IntTy
ITFixed NativeTy
IT8) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT64) (NativeTy -> IntTy
ITFixed NativeTy
IT8) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITBig (NativeTy -> IntTy
ITFixed NativeTy
IT8) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT8) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) (NativeTy -> IntTy
ITFixed NativeTy
IT16) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT64) (NativeTy -> IntTy
ITFixed NativeTy
IT16) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITBig (NativeTy -> IntTy
ITFixed NativeTy
IT16) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT16) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT64) (NativeTy -> IntTy
ITFixed NativeTy
IT32) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITBig (NativeTy -> IntTy
ITFixed NativeTy
IT32) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT32) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITBig (NativeTy -> IntTy
ITFixed NativeTy
IT64) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT16) IntTy
ITNative "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT32) IntTy
ITNative "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT64) IntTy
ITNative "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITBig IntTy
ITNative "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITNative (NativeTy -> IntTy
ITFixed NativeTy
IT64) "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce IntTy
ITBig IntTy
ITChar "trunc" IntTy -> IntTy -> [Const] -> Maybe Const
trunc IntTy -> IntTy -> PrimFn
LTrunc,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__addFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin Double -> Double -> Double
forall a. Num a => a -> a -> a
(+))
(2, ArithTy -> PrimFn
LPlus ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__subFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin (-))
(2, ArithTy -> PrimFn
LMinus ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__mulFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin Double -> Double -> Double
forall a. Num a => a -> a -> a
(*))
(2, ArithTy -> PrimFn
LTimes ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__divFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin Double -> Double -> Double
forall a. Fractional a => a -> a -> a
(/))
(2, ArithTy -> PrimFn
LSDiv ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__eqFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
(==))
(2, ArithTy -> PrimFn
LEq ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__sltFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(<))
(2, ArithTy -> PrimFn
LSLt ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__slteFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(<=))
(2, ArithTy -> PrimFn
LSLe ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__sgtFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(>))
(2, ArithTy -> PrimFn
LSGt ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__sgteFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(>=))
(2, ArithTy -> PrimFn
LSGe ArithTy
ATFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__concat") ([Const] -> Const -> Type
ty [Const
StrType, Const
StrType] Const
StrType) 2 ((String -> String -> String) -> [Const] -> Maybe Const
sBin String -> String -> String
forall a. [a] -> [a] -> [a]
(++))
(2, PrimFn
LStrConcat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__eqString") ([Const] -> Const -> Type
ty [Const
StrType, Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ((String -> String -> Bool) -> [Const] -> Maybe Const
bsBin String -> String -> Bool
forall a. Eq a => a -> a -> Bool
(==))
(2, PrimFn
LStrEq) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__ltString") ([Const] -> Const -> Type
ty [Const
StrType, Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ((String -> String -> Bool) -> [Const] -> Maybe Const
bsBin String -> String -> Bool
forall a. Ord a => a -> a -> Bool
(<))
(2, PrimFn
LStrLt) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim_lenString") ([Const] -> Const -> Type
ty [Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 1 ([Const] -> Maybe Const
p_strLen)
(1, PrimFn
LStrLen) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__charToInt") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 1 ([Const] -> Maybe Const
c_charToInt)
(1, IntTy -> PrimFn
LChInt IntTy
ITNative) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__intToChar") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))) 1 ([Const] -> Maybe Const
c_intToChar)
(1, IntTy -> PrimFn
LIntCh IntTy
ITNative) Totality
partial,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__strToFloat") ([Const] -> Const -> Type
ty [Const
StrType] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
c_strToFloat)
(1, PrimFn
LStrFloat) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatToStr") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] Const
StrType) 1 ([Const] -> Maybe Const
c_floatToStr)
(1, PrimFn
LFloatStr) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatExp") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatExp)
(1, PrimFn
LFExp) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatLog") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatLog)
(1, PrimFn
LFLog) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatSin") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatSin)
(1, PrimFn
LFSin) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatCos") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatCos)
(1, PrimFn
LFCos) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatTan") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatTan)
(1, PrimFn
LFTan) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatASin") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatASin)
(1, PrimFn
LFASin) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatACos") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatACos)
(1, PrimFn
LFACos) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatATan") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatATan)
(1, PrimFn
LFATan) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatATan2") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 2 ([Const] -> Maybe Const
p_floatATan2)
(2, PrimFn
LFATan2) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatSqrt") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatSqrt)
(1, PrimFn
LFSqrt) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatFloor") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatFloor)
(1, PrimFn
LFFloor) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__floatCeil") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
p_floatCeil)
(1, PrimFn
LFCeil) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__negFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 ([Const] -> Maybe Const
c_negFloat)
(1, PrimFn
LFNegate) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__strHead") ([Const] -> Const -> Type
ty [Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))) 1 ([Const] -> Maybe Const
p_strHead)
(1, PrimFn
LStrHead) Totality
partial,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__strTail") ([Const] -> Const -> Type
ty [Const
StrType] Const
StrType) 1 ([Const] -> Maybe Const
p_strTail)
(1, PrimFn
LStrTail) Totality
partial,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__strCons") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar)), Const
StrType] Const
StrType) 2 ([Const] -> Maybe Const
p_strCons)
(2, PrimFn
LStrCons) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__strIndex") ([Const] -> Const -> Type
ty [Const
StrType, (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))) 2 ([Const] -> Maybe Const
p_strIndex)
(2, PrimFn
LStrIndex) Totality
partial,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__strRev") ([Const] -> Const -> Type
ty [Const
StrType] Const
StrType) 1 ([Const] -> Maybe Const
p_strRev)
(1, PrimFn
LStrRev) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__strSubstr") ([Const] -> Const -> Type
ty [ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative), ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative), Const
StrType] Const
StrType) 3 ([Const] -> Maybe Const
p_strSubstr)
(3, PrimFn
LStrSubstr) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__readString") ([Const] -> Const -> Type
ty [Const
WorldType] Const
StrType) 1 ([Const] -> Maybe Const
forall a b. a -> Maybe b
p_cantreduce)
(1, PrimFn
LReadStr) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__writeString") ([Const] -> Const -> Type
ty [Const
WorldType,Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) 2 ([Const] -> Maybe Const
forall a b. a -> Maybe b
p_cantreduce)
(2, PrimFn
LWriteStr) Totality
total,
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN "prim__systemInfo") ([Const] -> Const -> Type
ty [ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative)] Const
StrType) 1 ([Const] -> Maybe Const
forall a b. a -> Maybe b
p_cantreduce)
(1, PrimFn
LSystemInfo) Totality
total
] [Prim] -> [Prim] -> [Prim]
forall a. [a] -> [a] -> [a]
++ (IntTy -> [Prim]) -> [IntTy] -> [Prim]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap IntTy -> [Prim]
intOps [NativeTy -> IntTy
ITFixed NativeTy
IT8, NativeTy -> IntTy
ITFixed NativeTy
IT16, NativeTy -> IntTy
ITFixed NativeTy
IT32, NativeTy -> IntTy
ITFixed NativeTy
IT64, IntTy
ITBig, IntTy
ITNative, IntTy
ITChar]
intOps :: IntTy -> [Prim]
intOps :: IntTy -> [Prim]
intOps ity :: IntTy
ity = IntTy -> [Prim]
intCmps IntTy
ity [Prim] -> [Prim] -> [Prim]
forall a. [a] -> [a] -> [a]
++ IntTy -> [Prim]
intArith IntTy
ity [Prim] -> [Prim] -> [Prim]
forall a. [a] -> [a] -> [a]
++ IntTy -> [Prim]
intConv IntTy
ity
intSCmps :: IntTy -> [Prim]
intSCmps :: IntTy -> [Prim]
intSCmps ity :: IntTy
ity =
[ IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "slt" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
sCmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(<))) (ArithTy -> PrimFn
LSLt (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
, IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "slte" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
sCmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(<=))) (ArithTy -> PrimFn
LSLe (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
, IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "eq" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity forall a. Eq a => a -> a -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
(==)) (ArithTy -> PrimFn
LEq (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
, IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "sgte" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
sCmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(>=))) (ArithTy -> PrimFn
LSGe (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
, IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "sgt" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
sCmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(>))) (ArithTy -> PrimFn
LSGt (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
]
intCmps :: IntTy -> [Prim]
intCmps :: IntTy -> [Prim]
intCmps ITNative = IntTy -> [Prim]
intSCmps IntTy
ITNative
intCmps ity :: IntTy
ity =
IntTy -> [Prim]
intSCmps IntTy
ity [Prim] -> [Prim] -> [Prim]
forall a. [a] -> [a] -> [a]
++
[ IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "lt" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
cmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(<))) IntTy -> PrimFn
LLt Totality
total
, IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "lte" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
cmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(<=))) IntTy -> PrimFn
LLe Totality
total
, IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "gte" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
cmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(>=))) IntTy -> PrimFn
LGe Totality
total
, IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity "gt" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity (IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
cmpOp IntTy
ity forall a. Ord a => a -> a -> Bool
(>))) IntTy -> PrimFn
LGt Totality
total
]
intArith :: IntTy -> [Prim]
intArith :: IntTy -> [Prim]
intArith ity :: IntTy
ity =
[ IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "add" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity forall a. Num a => a -> a -> a
forall a. (Bits a, Integral a) => a -> a -> a
(+)) (ArithTy -> PrimFn
LPlus (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "sub" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity (-)) (ArithTy -> PrimFn
LMinus (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "mul" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity forall a. Num a => a -> a -> a
forall a. (Bits a, Integral a) => a -> a -> a
(*)) (ArithTy -> PrimFn
LTimes (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "udiv" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity forall a. Integral a => a -> a -> a
forall a. (Bits a, Integral a) => a -> a -> a
quot) IntTy -> PrimFn
LUDiv Totality
partial
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "sdiv" (IntTy -> [Const] -> Maybe Const
bsdiv IntTy
ity) (ArithTy -> PrimFn
LSDiv (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
partial
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "urem" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity forall a. Integral a => a -> a -> a
forall a. (Bits a, Integral a) => a -> a -> a
rem) IntTy -> PrimFn
LURem Totality
partial
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "srem" (IntTy -> [Const] -> Maybe Const
bsrem IntTy
ity) (ArithTy -> PrimFn
LSRem (ArithTy -> PrimFn) -> (IntTy -> ArithTy) -> IntTy -> PrimFn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt) Totality
partial
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "shl" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity (\x :: a
x y :: a
y -> a -> Int -> a
forall a. Bits a => a -> Int -> a
shiftL a
x (a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
y))) IntTy -> PrimFn
LSHL Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "lshr" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity (\x :: a
x y :: a
y -> a -> Int -> a
forall a. Bits a => a -> Int -> a
shiftR a
x (a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
y))) IntTy -> PrimFn
LLSHR Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "ashr" (IntTy -> [Const] -> Maybe Const
bashr IntTy
ity) IntTy -> PrimFn
LASHR Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "and" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity forall a. Bits a => a -> a -> a
forall a. (Bits a, Integral a) => a -> a -> a
(.&.)) IntTy -> PrimFn
LAnd Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "or" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity forall a. Bits a => a -> a -> a
forall a. (Bits a, Integral a) => a -> a -> a
(.|.)) IntTy -> PrimFn
LOr Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity "xor" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity (a -> a -> a
forall a. Bits a => a -> a -> a
xor)) IntTy -> PrimFn
LXOr Totality
total
, IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iUnOp IntTy
ity "compl" (IntTy -> (forall a. Bits a => a -> a) -> [Const] -> Maybe Const
bUn IntTy
ity forall a. Bits a => a -> a
complement) IntTy -> PrimFn
LCompl Totality
total
]
intConv :: IntTy -> [Prim]
intConv :: IntTy -> [Prim]
intConv ity :: IntTy
ity =
[ Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__toStr" String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
ity) ([Const] -> Const -> Type
ty [ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
ity] Const
StrType) 1 [Const] -> Maybe Const
intToStr
(1, IntTy -> PrimFn
LIntStr IntTy
ity) Totality
total
, Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__fromStr" String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
ity) ([Const] -> Const -> Type
ty [Const
StrType] (ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
ity)) 1 (IntTy -> [Const] -> Maybe Const
strToInt IntTy
ity)
(1, IntTy -> PrimFn
LStrInt IntTy
ity) Totality
total
, Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__toFloat" String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
ity) ([Const] -> Const -> Type
ty [ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
ity] (ArithTy -> Const
AType ArithTy
ATFloat)) 1 [Const] -> Maybe Const
intToFloat
(1, IntTy -> PrimFn
LIntFloat IntTy
ity) Totality
total
, Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__fromFloat" String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
ity) ([Const] -> Const -> Type
ty [ArithTy -> Const
AType ArithTy
ATFloat] (ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
ity)) 1 (IntTy -> [Const] -> Maybe Const
floatToInt IntTy
ity)
(1, IntTy -> PrimFn
LFloatInt IntTy
ity) Totality
total
]
iCmp :: IntTy -> String -> Bool -> ([Const] -> Maybe Const) -> (IntTy -> PrimFn) -> Totality -> Prim
iCmp :: IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp ity :: IntTy
ity op :: String
op self :: Bool
self impl :: [Const] -> Maybe Const
impl irop :: IntTy -> PrimFn
irop totality :: Totality
totality
= Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
op String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
ity)
([Const] -> Const -> Type
ty (Int -> Const -> [Const]
forall a. Int -> a -> [a]
replicate 2 (Const -> [Const]) -> (IntTy -> Const) -> IntTy -> [Const]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> [Const]) -> IntTy -> [Const]
forall a b. (a -> b) -> a -> b
$ IntTy
ity) (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt (if Bool
self then IntTy
ity else IntTy
ITNative))))
2 [Const] -> Maybe Const
impl (2, IntTy -> PrimFn
irop IntTy
ity) Totality
totality
iBinOp, iUnOp :: IntTy -> String -> ([Const] -> Maybe Const) -> (IntTy -> PrimFn) -> Totality -> Prim
iBinOp :: IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp ity :: IntTy
ity op :: String
op impl :: [Const] -> Maybe Const
impl irop :: IntTy -> PrimFn
irop totality :: Totality
totality
= Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
op String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
ity)
([Const] -> Const -> Type
ty (Int -> Const -> [Const]
forall a. Int -> a -> [a]
replicate 2 (Const -> [Const]) -> (IntTy -> Const) -> IntTy -> [Const]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> [Const]) -> IntTy -> [Const]
forall a b. (a -> b) -> a -> b
$ IntTy
ity) (ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
ity))
2 [Const] -> Maybe Const
impl (2, IntTy -> PrimFn
irop IntTy
ity) Totality
totality
iUnOp :: IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iUnOp ity :: IntTy
ity op :: String
op impl :: [Const] -> Maybe Const
impl irop :: IntTy -> PrimFn
irop totality :: Totality
totality
= Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
op String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
ity)
([Const] -> Const -> Type
ty [ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
ity] (ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
ity))
1 [Const] -> Maybe Const
impl (1, IntTy -> PrimFn
irop IntTy
ity) Totality
totality
iCoerce :: IntTy -> IntTy -> String -> (IntTy -> IntTy -> [Const] -> Maybe Const) -> (IntTy -> IntTy -> PrimFn) -> Prim
iCoerce :: IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce from :: IntTy
from to :: IntTy
to op :: String
op impl :: IntTy -> IntTy -> [Const] -> Maybe Const
impl irop :: IntTy -> IntTy -> PrimFn
irop =
Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ "prim__" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
op String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
from String -> String -> String
forall a. [a] -> [a] -> [a]
++ "_" String -> String -> String
forall a. [a] -> [a] -> [a]
++ IntTy -> String
intTyName IntTy
to)
([Const] -> Const -> Type
ty [ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
from] (ArithTy -> Const
AType (ArithTy -> Const) -> (IntTy -> ArithTy) -> IntTy -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntTy -> ArithTy
ATInt (IntTy -> Const) -> IntTy -> Const
forall a b. (a -> b) -> a -> b
$ IntTy
to)) 1 (IntTy -> IntTy -> [Const] -> Maybe Const
impl IntTy
from IntTy
to) (1, IntTy -> IntTy -> PrimFn
irop IntTy
from IntTy
to) Totality
total
fBin :: (Double -> Double -> Double) -> [Const] -> Maybe Const
fBin :: (Double -> Double -> Double) -> [Const] -> Maybe Const
fBin op :: Double -> Double -> Double
op [Fl x :: Double
x, Fl y :: Double
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Double -> Const
Fl (Double -> Double -> Double
op Double
x Double
y)
fBin _ _ = Maybe Const
forall a. Maybe a
Nothing
bfBin :: (Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin :: (Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin op :: Double -> Double -> Bool
op [Fl x :: Double
x, Fl y :: Double
y] = let i :: Int
i = (if Double -> Double -> Bool
op Double
x Double
y then 1 else 0) in
Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I Int
i
bfBin _ _ = Maybe Const
forall a. Maybe a
Nothing
bsBin :: (String -> String -> Bool) -> [Const] -> Maybe Const
bsBin :: (String -> String -> Bool) -> [Const] -> Maybe Const
bsBin op :: String -> String -> Bool
op [Str x :: String
x, Str y :: String
y]
= let i :: Int
i = (if String -> String -> Bool
op String
x String
y then 1 else 0) in
Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I Int
i
bsBin _ _ = Maybe Const
forall a. Maybe a
Nothing
sBin :: (String -> String -> String) -> [Const] -> Maybe Const
sBin :: (String -> String -> String) -> [Const] -> Maybe Const
sBin op :: String -> String -> String
op [Str x :: String
x, Str y :: String
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ String -> Const
Str (String -> String -> String
op String
x String
y)
sBin _ _ = Maybe Const
forall a. Maybe a
Nothing
bsrem :: IntTy -> [Const] -> Maybe Const
bsrem :: IntTy -> [Const] -> Maybe Const
bsrem ITBig [BI x :: Integer
x, BI y :: Integer
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const)
-> (Integer -> Const) -> Integer -> Maybe Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Const
BI (Integer -> Maybe Const) -> Integer -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Integer
x Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`rem` Integer
y
bsrem (ITFixed IT8) [B8 x :: Word8
x, B8 y :: Word8
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word8 -> Const
B8 (Int8 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x Int8 -> Int8 -> Int8
forall a. Integral a => a -> a -> a
`rem` Word8 -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
y :: Int8))
bsrem (ITFixed IT16) [B16 x :: Word16
x, B16 y :: Word16
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word16 -> Const
B16 (Int16 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16 -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
x Int16 -> Int16 -> Int16
forall a. Integral a => a -> a -> a
`rem` Word16 -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
y :: Int16))
bsrem (ITFixed IT32) [B32 x :: Word32
x, B32 y :: Word32
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word32 -> Const
B32 (Int32 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32 -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
x Int32 -> Int32 -> Int32
forall a. Integral a => a -> a -> a
`rem` Word32 -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
y :: Int32))
bsrem (ITFixed IT64) [B64 x :: Word64
x, B64 y :: Word64
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word64 -> Const
B64 (Int64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
x Int64 -> Int64 -> Int64
forall a. Integral a => a -> a -> a
`rem` Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
y :: Int64))
bsrem ITNative [I x :: Int
x, I y :: Int
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (Int
x Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` Int
y)
bsrem ITChar [Ch x :: Char
x, Ch y :: Char
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char -> Const
Ch (Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ (Char -> Int
ord Char
x) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`rem` (Char -> Int
ord Char
y))
bsrem _ _ = Maybe Const
forall a. Maybe a
Nothing
bsdiv :: IntTy -> [Const] -> Maybe Const
bsdiv :: IntTy -> [Const] -> Maybe Const
bsdiv ITBig [BI x :: Integer
x, BI y :: Integer
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const)
-> (Integer -> Const) -> Integer -> Maybe Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Const
BI (Integer -> Maybe Const) -> Integer -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Integer
x Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`quot` Integer
y
bsdiv (ITFixed IT8) [B8 x :: Word8
x, B8 y :: Word8
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word8 -> Const
B8 (Int8 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x Int8 -> Int8 -> Int8
forall a. Integral a => a -> a -> a
`quot` Word8 -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
y :: Int8))
bsdiv (ITFixed IT16) [B16 x :: Word16
x, B16 y :: Word16
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word16 -> Const
B16 (Int16 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16 -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
x Int16 -> Int16 -> Int16
forall a. Integral a => a -> a -> a
`quot` Word16 -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
y :: Int16))
bsdiv (ITFixed IT32) [B32 x :: Word32
x, B32 y :: Word32
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word32 -> Const
B32 (Int32 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32 -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
x Int32 -> Int32 -> Int32
forall a. Integral a => a -> a -> a
`quot` Word32 -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
y :: Int32))
bsdiv (ITFixed IT64) [B64 x :: Word64
x, B64 y :: Word64
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word64 -> Const
B64 (Int64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
x Int64 -> Int64 -> Int64
forall a. Integral a => a -> a -> a
`quot` Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
y :: Int64))
bsdiv ITNative [I x :: Int
x, I y :: Int
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (Int
x Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
y)
bsdiv ITChar [Ch x :: Char
x, Ch y :: Char
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char -> Const
Ch (Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ (Char -> Int
ord Char
x) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` (Char -> Int
ord Char
y))
bsdiv _ _ = Maybe Const
forall a. Maybe a
Nothing
bashr :: IntTy -> [Const] -> Maybe Const
bashr :: IntTy -> [Const] -> Maybe Const
bashr ITBig [BI x :: Integer
x, BI y :: Integer
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Integer -> Const
BI (Integer
x Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
`shiftR` Integer -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
y)
bashr (ITFixed IT8) [B8 x :: Word8
x, B8 y :: Word8
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word8 -> Const
B8 (Int8 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x Int8 -> Int -> Int8
forall a. Bits a => a -> Int -> a
`shiftR` Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
y :: Int8))
bashr (ITFixed IT16) [B16 x :: Word16
x, B16 y :: Word16
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word16 -> Const
B16 (Int16 -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16 -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
x Int16 -> Int -> Int16
forall a. Bits a => a -> Int -> a
`shiftR` Word16 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
y :: Int16))
bashr (ITFixed IT32) [B32 x :: Word32
x, B32 y :: Word32
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word32 -> Const
B32 (Int32 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32 -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
x Int32 -> Int -> Int32
forall a. Bits a => a -> Int -> a
`shiftR` Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
y :: Int32))
bashr (ITFixed IT64) [B64 x :: Word64
x, B64 y :: Word64
y]
= Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word64 -> Const
B64 (Int64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
x Int64 -> Int -> Int64
forall a. Bits a => a -> Int -> a
`shiftR` Word64 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
y :: Int64))
bashr ITNative [I x :: Int
x, I y :: Int
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (Int
x Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` Int
y)
bashr ITChar [Ch x :: Char
x, Ch y :: Char
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char -> Const
Ch (Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ (Char -> Int
ord Char
x) Int -> Int -> Int
forall a. Bits a => a -> Int -> a
`shiftR` (Char -> Int
ord Char
y))
bashr _ _ = Maybe Const
forall a. Maybe a
Nothing
bUn :: IntTy -> (forall a. Bits a => a -> a) -> [Const] -> Maybe Const
bUn :: IntTy -> (forall a. Bits a => a -> a) -> [Const] -> Maybe Const
bUn (ITFixed IT8) op :: forall a. Bits a => a -> a
op [B8 x :: Word8
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word8 -> Const
B8 (Word8 -> Word8
forall a. Bits a => a -> a
op Word8
x)
bUn (ITFixed IT16) op :: forall a. Bits a => a -> a
op [B16 x :: Word16
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word16 -> Const
B16 (Word16 -> Word16
forall a. Bits a => a -> a
op Word16
x)
bUn (ITFixed IT32) op :: forall a. Bits a => a -> a
op [B32 x :: Word32
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word32 -> Const
B32 (Word32 -> Word32
forall a. Bits a => a -> a
op Word32
x)
bUn (ITFixed IT64) op :: forall a. Bits a => a -> a
op [B64 x :: Word64
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word64 -> Const
B64 (Word64 -> Word64
forall a. Bits a => a -> a
op Word64
x)
bUn ITBig op :: forall a. Bits a => a -> a
op [BI x :: Integer
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Integer -> Const
BI (Integer -> Integer
forall a. Bits a => a -> a
op Integer
x)
bUn ITNative op :: forall a. Bits a => a -> a
op [I x :: Int
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (Int -> Int
forall a. Bits a => a -> a
op Int
x)
bUn ITChar op :: forall a. Bits a => a -> a
op [Ch x :: Char
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char -> Const
Ch (Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ Int -> Int
forall a. Bits a => a -> a
op (Char -> Int
ord Char
x))
bUn _ _ _ = Maybe Const
forall a. Maybe a
Nothing
bitBin :: IntTy -> (forall a. (Bits a, Integral a) => a -> a -> a) -> [Const] -> Maybe Const
bitBin :: IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin (ITFixed IT8) op :: forall a. (Bits a, Integral a) => a -> a -> a
op [B8 x :: Word8
x, B8 y :: Word8
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word8 -> Const
B8 (Word8 -> Word8 -> Word8
forall a. (Bits a, Integral a) => a -> a -> a
op Word8
x Word8
y)
bitBin (ITFixed IT16) op :: forall a. (Bits a, Integral a) => a -> a -> a
op [B16 x :: Word16
x, B16 y :: Word16
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word16 -> Const
B16 (Word16 -> Word16 -> Word16
forall a. (Bits a, Integral a) => a -> a -> a
op Word16
x Word16
y)
bitBin (ITFixed IT32) op :: forall a. (Bits a, Integral a) => a -> a -> a
op [B32 x :: Word32
x, B32 y :: Word32
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word32 -> Const
B32 (Word32 -> Word32 -> Word32
forall a. (Bits a, Integral a) => a -> a -> a
op Word32
x Word32
y)
bitBin (ITFixed IT64) op :: forall a. (Bits a, Integral a) => a -> a -> a
op [B64 x :: Word64
x, B64 y :: Word64
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Word64 -> Const
B64 (Word64 -> Word64 -> Word64
forall a. (Bits a, Integral a) => a -> a -> a
op Word64
x Word64
y)
bitBin ITBig op :: forall a. (Bits a, Integral a) => a -> a -> a
op [BI x :: Integer
x, BI y :: Integer
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Integer -> Const
BI (Integer -> Integer -> Integer
forall a. (Bits a, Integral a) => a -> a -> a
op Integer
x Integer
y)
bitBin ITNative op :: forall a. (Bits a, Integral a) => a -> a -> a
op [I x :: Int
x, I y :: Int
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (Int -> Int -> Int
forall a. (Bits a, Integral a) => a -> a -> a
op Int
x Int
y)
bitBin ITChar op :: forall a. (Bits a, Integral a) => a -> a -> a
op [Ch x :: Char
x, Ch y :: Char
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char -> Const
Ch (Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. (Bits a, Integral a) => a -> a -> a
op (Char -> Int
ord Char
x) (Char -> Int
ord Char
y))
bitBin _ _ _ = Maybe Const
forall a. Maybe a
Nothing
bCmp :: IntTy -> (forall a. (Integral a, Ord a) => a -> a -> Bool) -> [Const] -> Maybe Const
bCmp :: IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp (ITFixed IT8) op :: forall a. (Integral a, Ord a) => a -> a -> Bool
op [B8 x :: Word8
x, B8 y :: Word8
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (if (Word8 -> Word8 -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
op Word8
x Word8
y) then 1 else 0)
bCmp (ITFixed IT16) op :: forall a. (Integral a, Ord a) => a -> a -> Bool
op [B16 x :: Word16
x, B16 y :: Word16
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (if (Word16 -> Word16 -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
op Word16
x Word16
y) then 1 else 0)
bCmp (ITFixed IT32) op :: forall a. (Integral a, Ord a) => a -> a -> Bool
op [B32 x :: Word32
x, B32 y :: Word32
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (if (Word32 -> Word32 -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
op Word32
x Word32
y) then 1 else 0)
bCmp (ITFixed IT64) op :: forall a. (Integral a, Ord a) => a -> a -> Bool
op [B64 x :: Word64
x, B64 y :: Word64
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (if (Word64 -> Word64 -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
op Word64
x Word64
y) then 1 else 0)
bCmp ITBig op :: forall a. (Integral a, Ord a) => a -> a -> Bool
op [BI x :: Integer
x, BI y :: Integer
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (if (Integer -> Integer -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
op Integer
x Integer
y) then 1 else 0)
bCmp ITNative op :: forall a. (Integral a, Ord a) => a -> a -> Bool
op [I x :: Int
x, I y :: Int
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (if (Int -> Int -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
op Int
x Int
y) then 1 else 0)
bCmp ITChar op :: forall a. (Integral a, Ord a) => a -> a -> Bool
op [Ch x :: Char
x, Ch y :: Char
y] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (if (Int -> Int -> Bool
forall a. (Integral a, Ord a) => a -> a -> Bool
op (Char -> Int
ord Char
x) (Char -> Int
ord Char
y)) then 1 else 0)
bCmp _ _ _ = Maybe Const
forall a. Maybe a
Nothing
cmpOp :: (Ord a, Integral a) => IntTy -> (forall b. Ord b => b -> b -> Bool) -> a -> a -> Bool
cmpOp :: IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
cmpOp (ITFixed _) f :: forall a. Ord a => a -> a -> Bool
f = a -> a -> Bool
forall a. Ord a => a -> a -> Bool
f
cmpOp (IntTy
ITNative) f :: forall a. Ord a => a -> a -> Bool
f = Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
f (Word -> Word -> Bool) -> (a -> Word) -> a -> a -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (forall a. Integral a => a -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Word)
cmpOp (IntTy
ITChar) f :: forall a. Ord a => a -> a -> Bool
f = Word -> Word -> Bool
forall a. Ord a => a -> a -> Bool
f (Word -> Word -> Bool) -> (a -> Word) -> a -> a -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` ((forall a. Integral a => a -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Word))
cmpOp _ f :: forall a. Ord a => a -> a -> Bool
f = let xor :: Bool -> Bool -> Bool
xor = Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
(/=) in (\ x :: a
x y :: a
y -> (a -> a -> Bool
forall a. Ord a => a -> a -> Bool
f a
x a
y) Bool -> Bool -> Bool
`xor` (a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< 0) Bool -> Bool -> Bool
`xor` (a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< 0))
sCmpOp :: (Ord a, Integral a) => IntTy -> (forall b. Ord b => b -> b -> Bool) -> a -> a -> Bool
sCmpOp :: IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
sCmpOp (ITFixed IT8) f :: forall a. Ord a => a -> a -> Bool
f = Int8 -> Int8 -> Bool
forall a. Ord a => a -> a -> Bool
f (Int8 -> Int8 -> Bool) -> (a -> Int8) -> a -> a -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (forall a. Integral a => a -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int8)
sCmpOp (ITFixed IT16) f :: forall a. Ord a => a -> a -> Bool
f = Int16 -> Int16 -> Bool
forall a. Ord a => a -> a -> Bool
f (Int16 -> Int16 -> Bool) -> (a -> Int16) -> a -> a -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (forall a. Integral a => a -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int16)
sCmpOp (ITFixed IT32) f :: forall a. Ord a => a -> a -> Bool
f = Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
f (Int32 -> Int32 -> Bool) -> (a -> Int32) -> a -> a -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (forall a. Integral a => a -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int32)
sCmpOp (ITFixed IT64) f :: forall a. Ord a => a -> a -> Bool
f = Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
f (Int64 -> Int64 -> Bool) -> (a -> Int64) -> a -> a -> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` (forall a. Integral a => a -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int64)
sCmpOp _ f :: forall a. Ord a => a -> a -> Bool
f = a -> a -> Bool
forall a. Ord a => a -> a -> Bool
f
toInt :: Integral a => IntTy -> a -> Const
toInt :: IntTy -> a -> Const
toInt (ITFixed IT8) x :: a
x = Word8 -> Const
B8 (a -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt (ITFixed IT16) x :: a
x = Word16 -> Const
B16 (a -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt (ITFixed IT32) x :: a
x = Word32 -> Const
B32 (a -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt (ITFixed IT64) x :: a
x = Word64 -> Const
B64 (a -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt ITBig x :: a
x = Integer -> Const
BI (a -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt ITNative x :: a
x = Int -> Const
I (a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt ITChar x :: a
x = Char -> Const
Ch (Int -> Char
chr (Int -> Char) -> Int -> Char
forall a b. (a -> b) -> a -> b
$ a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
intToInt :: IntTy -> IntTy -> [Const] -> Maybe Const
intToInt :: IntTy -> IntTy -> [Const] -> Maybe Const
intToInt (ITFixed IT8) out :: IntTy
out [B8 x :: Word8
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Word8 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out Word8
x
intToInt (ITFixed IT16) out :: IntTy
out [B16 x :: Word16
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Word16 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out Word16
x
intToInt (ITFixed IT32) out :: IntTy
out [B32 x :: Word32
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Word32 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out Word32
x
intToInt (ITFixed IT64) out :: IntTy
out [B64 x :: Word64
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Word64 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out Word64
x
intToInt ITBig out :: IntTy
out [BI x :: Integer
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Integer -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out Integer
x
intToInt ITNative out :: IntTy
out [I x :: Int
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Int -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out Int
x
intToInt ITChar out :: IntTy
out [Ch x :: Char
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Int -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out (Char -> Int
ord Char
x)
intToInt _ _ _ = Maybe Const
forall a. Maybe a
Nothing
zext :: IntTy -> IntTy -> [Const] -> Maybe Const
zext :: IntTy -> IntTy -> [Const] -> Maybe Const
zext from :: IntTy
from ITBig val :: [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
from IntTy
ITBig [Const]
val
zext ITBig _ _ = Maybe Const
forall a. Maybe a
Nothing
zext f :: IntTy
f@(ITFixed from :: NativeTy
from) t :: IntTy
t@(ITFixed to :: NativeTy
to) val :: [Const]
val
| NativeTy -> Int
nativeTyWidth NativeTy
from Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< NativeTy -> Int
nativeTyWidth NativeTy
to = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
f IntTy
t [Const]
val
zext ITNative to :: IntTy
to [I x :: Int
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Word -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
to (Int -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
x :: Word)
zext from :: IntTy
from ITNative val :: [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
from IntTy
ITNative [Const]
val
zext _ _ _ = Maybe Const
forall a. Maybe a
Nothing
sext :: IntTy -> IntTy -> [Const] -> Maybe Const
sext :: IntTy -> IntTy -> [Const] -> Maybe Const
sext (ITFixed IT8) out :: IntTy
out [B8 x :: Word8
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Int8 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out (Word8 -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
x :: Int8)
sext (ITFixed IT16) out :: IntTy
out [B16 x :: Word16
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Int16 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out (Word16 -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
x :: Int16)
sext (ITFixed IT32) out :: IntTy
out [B32 x :: Word32
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Int32 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out (Word32 -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
x :: Int32)
sext (ITFixed IT64) out :: IntTy
out [B64 x :: Word64
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Int64 -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
out (Word64 -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
x :: Int64)
sext ITBig _ _ = Maybe Const
forall a. Maybe a
Nothing
sext from :: IntTy
from to :: IntTy
to val :: [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
from IntTy
to [Const]
val
trunc :: IntTy -> IntTy -> [Const] -> Maybe Const
trunc :: IntTy -> IntTy -> [Const] -> Maybe Const
trunc ITBig to :: IntTy
to val :: [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
ITBig IntTy
to [Const]
val
trunc _ ITBig _ = Maybe Const
forall a. Maybe a
Nothing
trunc f :: IntTy
f@(ITFixed from :: NativeTy
from) t :: IntTy
t@(ITFixed to :: NativeTy
to) val :: [Const]
val | NativeTy -> Int
nativeTyWidth NativeTy
from Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> NativeTy -> Int
nativeTyWidth NativeTy
to = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
f IntTy
t [Const]
val
trunc ITNative to :: IntTy
to [I x :: Int
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Int -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
to Int
x
trunc from :: IntTy
from ITNative val :: [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
from IntTy
ITNative [Const]
val
trunc _ _ _ = Maybe Const
forall a. Maybe a
Nothing
intToStr :: [Const] -> Maybe Const
intToStr :: [Const] -> Maybe Const
intToStr val :: [Const]
val | [i :: Integer
i] <- [Const] -> [Integer]
getInt [Const]
val = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ String -> Const
Str (Integer -> String
forall a. Show a => a -> String
show Integer
i)
intToStr _ = Maybe Const
forall a. Maybe a
Nothing
getInt :: [Const] -> [Integer]
getInt :: [Const] -> [Integer]
getInt (B8 x :: Word8
x : xs :: [Const]
xs) = Word8 -> Integer
forall a. Integral a => a -> Integer
toInteger Word8
x Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Const] -> [Integer]
getInt [Const]
xs
getInt (B16 x :: Word16
x : xs :: [Const]
xs) = Word16 -> Integer
forall a. Integral a => a -> Integer
toInteger Word16
x Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Const] -> [Integer]
getInt [Const]
xs
getInt (B32 x :: Word32
x : xs :: [Const]
xs) = Word32 -> Integer
forall a. Integral a => a -> Integer
toInteger Word32
x Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Const] -> [Integer]
getInt [Const]
xs
getInt (B64 x :: Word64
x : xs :: [Const]
xs) = Word64 -> Integer
forall a. Integral a => a -> Integer
toInteger Word64
x Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Const] -> [Integer]
getInt [Const]
xs
getInt (I x :: Int
x : xs :: [Const]
xs) = Int -> Integer
forall a. Integral a => a -> Integer
toInteger Int
x Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Const] -> [Integer]
getInt [Const]
xs
getInt (BI x :: Integer
x : xs :: [Const]
xs) = Integer
x Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Const] -> [Integer]
getInt [Const]
xs
getInt _ = []
strToInt :: IntTy -> [Const] -> Maybe Const
strToInt :: IntTy -> [Const] -> Maybe Const
strToInt ity :: IntTy
ity [Str x :: String
x] = case ReadS Integer
forall a. Read a => ReadS a
reads ReadS Integer -> ReadS Integer
forall a b. (a -> b) -> a -> b
$ String -> String
dropFirstPlus String
x of
[(n :: Integer
n,s :: String
s)] -> Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ if (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace String
s then IntTy -> Integer -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
ity (Integer
n :: Integer) else Int -> Const
I 0
_ -> Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I 0
where
dropFirstPlus :: String -> String
dropFirstPlus :: String -> String
dropFirstPlus ('+' : str :: String
str) = String
str
dropFirstPlus str :: String
str = String
str
strToInt _ _ = Maybe Const
forall a. Maybe a
Nothing
intToFloat :: [Const] -> Maybe Const
intToFloat :: [Const] -> Maybe Const
intToFloat val :: [Const]
val | [i :: Integer
i] <- [Const] -> [Integer]
getInt [Const]
val = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Double -> Const
Fl (Integer -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
i)
intToFloat _ = Maybe Const
forall a. Maybe a
Nothing
floatToInt :: IntTy -> [Const] -> Maybe Const
floatToInt :: IntTy -> [Const] -> Maybe Const
floatToInt ity :: IntTy
ity [Fl x :: Double
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ IntTy -> Integer -> Const
forall a. Integral a => IntTy -> a -> Const
toInt IntTy
ity (Double -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
truncate Double
x :: Integer)
floatToInt _ _ = Maybe Const
forall a. Maybe a
Nothing
c_intToChar, c_charToInt :: [Const] -> Maybe Const
c_intToChar :: [Const] -> Maybe Const
c_intToChar [(I x :: Int
x)] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> (Int -> Const) -> Int -> Maybe Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Const
Ch (Char -> Const) -> (Int -> Char) -> Int -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Char
forall a. Enum a => Int -> a
toEnum (Int -> Maybe Const) -> Int -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int
x
c_intToChar _ = Maybe Const
forall a. Maybe a
Nothing
c_charToInt :: [Const] -> Maybe Const
c_charToInt [(Ch x :: Char
x)] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> (Char -> Const) -> Char -> Maybe Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Const
I (Int -> Const) -> (Char -> Int) -> Char -> Const
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
forall a. Enum a => a -> Int
fromEnum (Char -> Maybe Const) -> Char -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char
x
c_charToInt _ = Maybe Const
forall a. Maybe a
Nothing
c_negFloat :: [Const] -> Maybe Const
c_negFloat :: [Const] -> Maybe Const
c_negFloat [Fl x :: Double
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Double -> Const
Fl (Double -> Double
forall a. Num a => a -> a
negate Double
x)
c_negFloat _ = Maybe Const
forall a. Maybe a
Nothing
c_floatToStr :: [Const] -> Maybe Const
c_floatToStr :: [Const] -> Maybe Const
c_floatToStr [Fl x :: Double
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ String -> Const
Str (Double -> String
forall a. Show a => a -> String
show Double
x)
c_floatToStr _ = Maybe Const
forall a. Maybe a
Nothing
c_strToFloat :: [Const] -> Maybe Const
c_strToFloat [Str x :: String
x] = case ReadS Double
forall a. Read a => ReadS a
reads String
x of
[(n :: Double
n,s :: String
s)] -> Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Double -> Const
Fl (if (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace String
s then Double
n else 0)
_ -> Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Double -> Const
Fl 0
c_strToFloat _ = Maybe Const
forall a. Maybe a
Nothing
p_fPrim :: (Double -> Double) -> [Const] -> Maybe Const
p_fPrim :: (Double -> Double) -> [Const] -> Maybe Const
p_fPrim f :: Double -> Double
f [Fl x :: Double
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Double -> Const
Fl (Double -> Double
f Double
x)
p_fPrim f :: Double -> Double
f _ = Maybe Const
forall a. Maybe a
Nothing
p_floatExp, p_floatLog, p_floatSin, p_floatCos, p_floatTan, p_floatASin, p_floatACos, p_floatATan, p_floatSqrt, p_floatFloor, p_floatCeil :: [Const] -> Maybe Const
p_floatExp :: [Const] -> Maybe Const
p_floatExp = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
exp
p_floatLog :: [Const] -> Maybe Const
p_floatLog = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
log
p_floatSin :: [Const] -> Maybe Const
p_floatSin = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
sin
p_floatCos :: [Const] -> Maybe Const
p_floatCos = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
cos
p_floatTan :: [Const] -> Maybe Const
p_floatTan = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
tan
p_floatASin :: [Const] -> Maybe Const
p_floatASin = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
asin
p_floatACos :: [Const] -> Maybe Const
p_floatACos = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
acos
p_floatATan :: [Const] -> Maybe Const
p_floatATan = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
atan
p_floatSqrt :: [Const] -> Maybe Const
p_floatSqrt = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
forall a. Floating a => a -> a
sqrt
p_floatFloor :: [Const] -> Maybe Const
p_floatFloor = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim (Integer -> Double
forall a. Num a => Integer -> a
fromInteger (Integer -> Double) -> (Double -> Integer) -> Double -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
floor)
p_floatCeil :: [Const] -> Maybe Const
p_floatCeil = (Double -> Double) -> [Const] -> Maybe Const
p_fPrim (Integer -> Double
forall a. Num a => Integer -> a
fromInteger (Integer -> Double) -> (Double -> Integer) -> Double -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
ceiling)
p_floatATan2 :: [Const] -> Maybe Const
p_floatATan2 :: [Const] -> Maybe Const
p_floatATan2 [Fl y :: Double
y, Fl x :: Double
x] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Double -> Const
Fl (Double -> Double -> Double
forall a. RealFloat a => a -> a -> a
atan2 Double
y Double
x)
p_floatATan2 _ = Maybe Const
forall a. Maybe a
Nothing
p_strLen, p_strHead, p_strTail, p_strIndex, p_strCons, p_strRev, p_strSubstr :: [Const] -> Maybe Const
p_strLen :: [Const] -> Maybe Const
p_strLen [Str xs :: String
xs] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Int -> Const
I (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
xs)
p_strLen _ = Maybe Const
forall a. Maybe a
Nothing
p_strHead :: [Const] -> Maybe Const
p_strHead [Str (x :: Char
x:xs :: String
xs)] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char -> Const
Ch Char
x
p_strHead _ = Maybe Const
forall a. Maybe a
Nothing
p_strTail :: [Const] -> Maybe Const
p_strTail [Str (x :: Char
x:xs :: String
xs)] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ String -> Const
Str String
xs
p_strTail _ = Maybe Const
forall a. Maybe a
Nothing
p_strIndex :: [Const] -> Maybe Const
p_strIndex [Str xs :: String
xs, I i :: Int
i]
| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
xs = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ Char -> Const
Ch (String
xsString -> Int -> Char
forall a. [a] -> Int -> a
!!Int
i)
p_strIndex _ = Maybe Const
forall a. Maybe a
Nothing
p_strCons :: [Const] -> Maybe Const
p_strCons [Ch x :: Char
x, Str xs :: String
xs] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ String -> Const
Str (Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
xs)
p_strCons _ = Maybe Const
forall a. Maybe a
Nothing
p_strRev :: [Const] -> Maybe Const
p_strRev [Str xs :: String
xs] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ String -> Const
Str (String -> String
forall a. [a] -> [a]
reverse String
xs)
p_strRev _ = Maybe Const
forall a. Maybe a
Nothing
p_strSubstr :: [Const] -> Maybe Const
p_strSubstr [I offset :: Int
offset, I length :: Int
length, Str input :: String
input] = Const -> Maybe Const
forall a. a -> Maybe a
Just (Const -> Maybe Const) -> Const -> Maybe Const
forall a b. (a -> b) -> a -> b
$ String -> Const
Str (Int -> String -> String
forall a. Int -> [a] -> [a]
take Int
length (Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
offset String
input))
p_strSubstr _ = Maybe Const
forall a. Maybe a
Nothing
p_cantreduce :: a -> Maybe b
p_cantreduce :: a -> Maybe b
p_cantreduce _ = Maybe b
forall a. Maybe a
Nothing