{-|
Module      : Idris.Primitives
Description : Provision of primitive data types.

License     : BSD3
Maintainer  : The Idris Community.
-}
{-# 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 []     Const
x = Const -> Type
forall n. Const -> TT n
Constant Const
x
ty (Const
t:[Const]
ts) Const
x = Name -> Binder Type -> Type -> Type
forall n. n -> Binder (TT n) -> TT n -> TT n
Bind (Int -> String -> Name
sMN Int
0 String
"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 [] (-Int
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 =
   -- operators
  [IntTy
-> IntTy
-> String
-> (IntTy -> IntTy -> [Const] -> Maybe Const)
-> (IntTy -> IntTy -> PrimFn)
-> Prim
iCoerce (NativeTy -> IntTy
ITFixed NativeTy
IT8) (NativeTy -> IntTy
ITFixed NativeTy
IT16) String
"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) String
"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) String
"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 String
"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 String
"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) String
"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) String
"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 String
"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 String
"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) String
"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 String
"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 String
"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 String
"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 String
"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) String
"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) String
"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) String
"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 String
"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) String
"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) String
"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) String
"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 String
"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 String
"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) String
"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) String
"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 String
"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 String
"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) String
"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 String
"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 String
"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 String
"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 String
"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 String
"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) String
"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) String
"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) String
"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 String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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) String
"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 String
"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 String
"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 String
"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 String
"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) String
"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 String
"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 String
"prim__addFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin Double -> Double -> Double
forall a. Num a => a -> a -> a
(+))
     (Int
2, ArithTy -> PrimFn
LPlus ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__subFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin (-))
     (Int
2, ArithTy -> PrimFn
LMinus ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__mulFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin Double -> Double -> Double
forall a. Num a => a -> a -> a
(*))
     (Int
2, ArithTy -> PrimFn
LTimes ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__divFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
2 ((Double -> Double -> Double) -> [Const] -> Maybe Const
fBin Double -> Double -> Double
forall a. Fractional a => a -> a -> a
(/))
     (Int
2, ArithTy -> PrimFn
LSDiv ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__eqFloat")  ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
(==))
     (Int
2, ArithTy -> PrimFn
LEq ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__sltFloat")  ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(<))
     (Int
2, ArithTy -> PrimFn
LSLt ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__slteFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(<=))
     (Int
2, ArithTy -> PrimFn
LSLe ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__sgtFloat")  ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(>))
     (Int
2, ArithTy -> PrimFn
LSGt ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__sgteFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ((Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(>=))
     (Int
2, ArithTy -> PrimFn
LSGe ArithTy
ATFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__concat") ([Const] -> Const -> Type
ty [Const
StrType, Const
StrType] Const
StrType) Int
2 ((String -> String -> String) -> [Const] -> Maybe Const
sBin String -> String -> String
forall a. [a] -> [a] -> [a]
(++))
    (Int
2, PrimFn
LStrConcat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__eqString") ([Const] -> Const -> Type
ty [Const
StrType, Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ((String -> String -> Bool) -> [Const] -> Maybe Const
bsBin String -> String -> Bool
forall a. Eq a => a -> a -> Bool
(==))
    (Int
2, PrimFn
LStrEq) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__ltString") ([Const] -> Const -> Type
ty [Const
StrType, Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ((String -> String -> Bool) -> [Const] -> Maybe Const
bsBin String -> String -> Bool
forall a. Ord a => a -> a -> Bool
(<))
    (Int
2, PrimFn
LStrLt) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim_lenString") ([Const] -> Const -> Type
ty [Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
1 ([Const] -> Maybe Const
p_strLen)
    (Int
1, PrimFn
LStrLen) Totality
total,
    -- Conversions
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__charToInt") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
1 ([Const] -> Maybe Const
c_charToInt)
     (Int
1, IntTy -> PrimFn
LChInt IntTy
ITNative) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__intToChar") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))) Int
1 ([Const] -> Maybe Const
c_intToChar)
     (Int
1, IntTy -> PrimFn
LIntCh IntTy
ITNative) Totality
partial,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__strToFloat") ([Const] -> Const -> Type
ty [Const
StrType] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
c_strToFloat)
     (Int
1, PrimFn
LStrFloat) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatToStr") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] Const
StrType) Int
1 ([Const] -> Maybe Const
c_floatToStr)
     (Int
1, PrimFn
LFloatStr) Totality
total,

   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatExp") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatExp)
     (Int
1, PrimFn
LFExp) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatLog") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatLog)
     (Int
1, PrimFn
LFLog) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatSin") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatSin)
     (Int
1, PrimFn
LFSin) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatCos") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatCos)
     (Int
1, PrimFn
LFCos) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatTan") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatTan)
     (Int
1, PrimFn
LFTan) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatASin") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatASin)
     (Int
1, PrimFn
LFASin) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatACos") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatACos)
     (Int
1, PrimFn
LFACos) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatATan") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatATan)
     (Int
1, PrimFn
LFATan) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatATan2") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat), (ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
2 ([Const] -> Maybe Const
p_floatATan2)
     (Int
2, PrimFn
LFATan2) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatSqrt") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatSqrt)
     (Int
1, PrimFn
LFSqrt) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatFloor") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatFloor)
     (Int
1, PrimFn
LFFloor) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__floatCeil") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
p_floatCeil)
     (Int
1, PrimFn
LFCeil) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__negFloat") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType ArithTy
ATFloat)] (ArithTy -> Const
AType ArithTy
ATFloat)) Int
1 ([Const] -> Maybe Const
c_negFloat)
     (Int
1, PrimFn
LFNegate) Totality
total,

   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__strHead") ([Const] -> Const -> Type
ty [Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))) Int
1 ([Const] -> Maybe Const
p_strHead)
     (Int
1, PrimFn
LStrHead) Totality
partial,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__strTail") ([Const] -> Const -> Type
ty [Const
StrType] Const
StrType) Int
1 ([Const] -> Maybe Const
p_strTail)
     (Int
1, PrimFn
LStrTail) Totality
partial,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__strCons") ([Const] -> Const -> Type
ty [(ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar)), Const
StrType] Const
StrType) Int
2 ([Const] -> Maybe Const
p_strCons)
    (Int
2, PrimFn
LStrCons) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__strIndex") ([Const] -> Const -> Type
ty [Const
StrType, (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITChar))) Int
2 ([Const] -> Maybe Const
p_strIndex)
    (Int
2, PrimFn
LStrIndex) Totality
partial,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__strRev") ([Const] -> Const -> Type
ty [Const
StrType] Const
StrType) Int
1 ([Const] -> Maybe Const
p_strRev)
    (Int
1, PrimFn
LStrRev) Totality
total,
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"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) Int
3 ([Const] -> Maybe Const
p_strSubstr)
    (Int
3, PrimFn
LStrSubstr) Totality
total,

   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__readString") ([Const] -> Const -> Type
ty [Const
WorldType] Const
StrType) Int
1 ([Const] -> Maybe Const
forall a b. a -> Maybe b
p_cantreduce)
     (Int
1, PrimFn
LReadStr) Totality
total, -- total is okay, because we have 'WorldType'
   Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__writeString") ([Const] -> Const -> Type
ty [Const
WorldType,Const
StrType] (ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative))) Int
2 ([Const] -> Maybe Const
forall a b. a -> Maybe b
p_cantreduce)
     (Int
2, PrimFn
LWriteStr) Totality
total,
    Name
-> Type
-> Int
-> ([Const] -> Maybe Const)
-> (Int, PrimFn)
-> Totality
-> Prim
Prim (String -> Name
sUN String
"prim__systemInfo") ([Const] -> Const -> Type
ty [ArithTy -> Const
AType (IntTy -> ArithTy
ATInt IntTy
ITNative)] Const
StrType) Int
1 ([Const] -> Maybe Const
forall a b. a -> Maybe b
p_cantreduce)
        (Int
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 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 IntTy
ity =
    [ IntTy
-> String
-> Bool
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iCmp IntTy
ity String
"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 b -> b -> Bool
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 String
"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 b -> b -> Bool
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 String
"eq" Bool
False (IntTy
-> (forall a. (Integral a, Ord a) => a -> a -> Bool)
-> [Const]
-> Maybe Const
bCmp IntTy
ity a -> a -> Bool
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 String
"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 b -> b -> Bool
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 String
"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 b -> b -> Bool
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 IntTy
ITNative = IntTy -> [Prim]
intSCmps IntTy
ITNative
intCmps 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 String
"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 b -> b -> Bool
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 String
"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 b -> b -> Bool
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 String
"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 b -> b -> Bool
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 String
"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 b -> b -> Bool
forall a. Ord a => a -> a -> Bool
(>))) IntTy -> PrimFn
LGt Totality
total
    ]

intArith :: IntTy -> [Prim]
intArith :: IntTy -> [Prim]
intArith IntTy
ity =
    [ IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iBinOp IntTy
ity String
"add" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity a -> a -> a
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 String
"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 String
"mul" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity a -> a -> a
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 String
"udiv" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity a -> a -> a
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 String
"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 String
"urem" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity a -> a -> a
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 String
"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 String
"shl" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity (\a
x 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 String
"lshr" (IntTy
-> (forall a. (Bits a, Integral a) => a -> a -> a)
-> [Const]
-> Maybe Const
bitBin IntTy
ity (\a
x 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 String
"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 String
"and" (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
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 String
"or" (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
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 String
"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 String
"compl" (IntTy -> (forall a. Bits a => a -> a) -> [Const] -> Maybe Const
bUn IntTy
ity a -> a
forall a. Bits a => a -> a
complement) IntTy -> PrimFn
LCompl Totality
total
    ]

intConv :: IntTy -> [Prim]
intConv :: IntTy -> [Prim]
intConv 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
$ String
"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) Int
1 [Const] -> Maybe Const
intToStr
               (Int
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
$ String
"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)) Int
1 (IntTy -> [Const] -> Maybe Const
strToInt IntTy
ity)
               (Int
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
$ String
"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)) Int
1 [Const] -> Maybe Const
intToFloat
               (Int
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
$ String
"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)) Int
1 (IntTy -> [Const] -> Maybe Const
floatToInt IntTy
ity)
               (Int
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 IntTy
ity String
op Bool
self [Const] -> Maybe Const
impl IntTy -> PrimFn
irop 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
$ String
"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 Int
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))))
      Int
2 [Const] -> Maybe Const
impl (Int
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 IntTy
ity String
op [Const] -> Maybe Const
impl IntTy -> PrimFn
irop 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
$ String
"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 Int
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))
      Int
2 [Const] -> Maybe Const
impl (Int
2, IntTy -> PrimFn
irop IntTy
ity) Totality
totality
iUnOp :: IntTy
-> String
-> ([Const] -> Maybe Const)
-> (IntTy -> PrimFn)
-> Totality
-> Prim
iUnOp IntTy
ity String
op [Const] -> Maybe Const
impl IntTy -> PrimFn
irop 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
$ String
"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))
      Int
1 [Const] -> Maybe Const
impl (Int
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 IntTy
from IntTy
to String
op IntTy -> IntTy -> [Const] -> Maybe Const
impl 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
$ String
"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 -> 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)) Int
1 (IntTy -> IntTy -> [Const] -> Maybe Const
impl IntTy
from IntTy
to) (Int
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 Double -> Double -> Double
op [Fl Double
x, Fl 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 Double -> Double -> Double
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

bfBin :: (Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin :: (Double -> Double -> Bool) -> [Const] -> Maybe Const
bfBin Double -> Double -> Bool
op [Fl Double
x, Fl Double
y] = let i :: Int
i = (if Double -> Double -> Bool
op Double
x Double
y then Int
1 else Int
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 Double -> Double -> Bool
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

bsBin :: (String -> String -> Bool) -> [Const] -> Maybe Const
bsBin :: (String -> String -> Bool) -> [Const] -> Maybe Const
bsBin String -> String -> Bool
op [Str String
x, Str String
y]
    = let i :: Int
i = (if String -> String -> Bool
op String
x String
y then Int
1 else Int
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 String -> String -> Bool
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

sBin :: (String -> String -> String) -> [Const] -> Maybe Const
sBin :: (String -> String -> String) -> [Const] -> Maybe Const
sBin String -> String -> String
op [Str String
x, Str 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 String -> String -> String
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

bsrem :: IntTy -> [Const] -> Maybe Const
bsrem :: IntTy -> [Const] -> Maybe Const
bsrem IntTy
ITBig [BI Integer
x, BI 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 NativeTy
IT8) [B8 Word8
x, B8 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 NativeTy
IT16) [B16 Word16
x, B16 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 NativeTy
IT32) [B32 Word32
x, B32 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 NativeTy
IT64) [B64 Word64
x, B64 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 IntTy
ITNative [I Int
x, I 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 IntTy
ITChar [Ch Char
x, Ch 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 IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

bsdiv :: IntTy -> [Const] -> Maybe Const
bsdiv :: IntTy -> [Const] -> Maybe Const
bsdiv IntTy
ITBig [BI Integer
x, BI 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 NativeTy
IT8) [B8 Word8
x, B8 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 NativeTy
IT16) [B16 Word16
x, B16 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 NativeTy
IT32) [B32 Word32
x, B32 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 NativeTy
IT64) [B64 Word64
x, B64 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 IntTy
ITNative [I Int
x, I 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 IntTy
ITChar [Ch Char
x, Ch 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 IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

bashr :: IntTy -> [Const] -> Maybe Const
bashr :: IntTy -> [Const] -> Maybe Const
bashr IntTy
ITBig [BI Integer
x, BI 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 NativeTy
IT8) [B8 Word8
x, B8 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 NativeTy
IT16) [B16 Word16
x, B16 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 NativeTy
IT32) [B32 Word32
x, B32 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 NativeTy
IT64) [B64 Word64
x, B64 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 IntTy
ITNative [I Int
x, I 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 IntTy
ITChar [Ch Char
x, Ch 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 IntTy
_ [Const]
_ = 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 NativeTy
IT8)      forall a. Bits a => a -> a
op [B8  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 NativeTy
IT16)     forall a. Bits a => a -> a
op [B16 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 NativeTy
IT32)     forall a. Bits a => a -> a
op [B32 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 NativeTy
IT64)     forall a. Bits a => a -> a
op [B64 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 IntTy
ITBig    forall a. Bits a => a -> a
op [BI 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 IntTy
ITNative forall a. Bits a => a -> a
op [I 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 IntTy
ITChar forall a. Bits a => a -> a
op [Ch 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 IntTy
_        forall a. Bits a => a -> a
_   [Const]
_      = 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 NativeTy
IT8)      forall a. (Bits a, Integral a) => a -> a -> a
op [B8  Word8
x, B8  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 NativeTy
IT16)     forall a. (Bits a, Integral a) => a -> a -> a
op [B16 Word16
x, B16 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 NativeTy
IT32)     forall a. (Bits a, Integral a) => a -> a -> a
op [B32 Word32
x, B32 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 NativeTy
IT64)     forall a. (Bits a, Integral a) => a -> a -> a
op [B64 Word64
x, B64 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 IntTy
ITBig    forall a. (Bits a, Integral a) => a -> a -> a
op [BI Integer
x,  BI 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 IntTy
ITNative forall a. (Bits a, Integral a) => a -> a -> a
op [I Int
x,   I 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 IntTy
ITChar   forall a. (Bits a, Integral a) => a -> a -> a
op [Ch Char
x,  Ch 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 IntTy
_        forall a. (Bits a, Integral a) => a -> a -> a
_  [Const]
_              = 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 NativeTy
IT8)      forall a. (Integral a, Ord a) => a -> a -> Bool
op [B8  Word8
x, B8  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 Int
1 else Int
0)
bCmp (ITFixed NativeTy
IT16)     forall a. (Integral a, Ord a) => a -> a -> Bool
op [B16 Word16
x, B16 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 Int
1 else Int
0)
bCmp (ITFixed NativeTy
IT32)     forall a. (Integral a, Ord a) => a -> a -> Bool
op [B32 Word32
x, B32 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 Int
1 else Int
0)
bCmp (ITFixed NativeTy
IT64)     forall a. (Integral a, Ord a) => a -> a -> Bool
op [B64 Word64
x, B64 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 Int
1 else Int
0)
bCmp IntTy
ITBig    forall a. (Integral a, Ord a) => a -> a -> Bool
op [BI Integer
x, BI 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 Int
1 else Int
0)
bCmp IntTy
ITNative forall a. (Integral a, Ord a) => a -> a -> Bool
op [I Int
x, I 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 Int
1 else Int
0)
bCmp IntTy
ITChar   forall a. (Integral a, Ord a) => a -> a -> Bool
op [Ch Char
x, Ch 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 Int
1 else Int
0)
bCmp IntTy
_        forall a. (Integral a, Ord a) => a -> a -> Bool
_  [Const]
_              = Maybe Const
forall a. Maybe a
Nothing


cmpOp :: (Ord a, Integral a) => IntTy -> (forall b. Ord b => b -> b -> Bool) -> a -> a -> Bool
cmpOp :: forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
cmpOp (ITFixed NativeTy
_) forall a. Ord a => a -> a -> Bool
f = a -> a -> Bool
forall a. Ord a => a -> a -> Bool
f
cmpOp (IntTy
ITNative)  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` (a -> Word
forall {a}. Integral a => a -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Word)
cmpOp (IntTy
ITChar)    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` ((a -> Word
forall {a}. Integral a => a -> Word
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Word))
cmpOp IntTy
_ 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 (\ a
x 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
< a
0) Bool -> Bool -> Bool
`xor` (a
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
< a
0))

sCmpOp :: (Ord a, Integral a) => IntTy -> (forall b. Ord b => b -> b -> Bool) -> a -> a -> Bool
sCmpOp :: forall a.
(Ord a, Integral a) =>
IntTy -> (forall a. Ord a => a -> a -> Bool) -> a -> a -> Bool
sCmpOp (ITFixed NativeTy
IT8) 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` (a -> Int8
forall {a}. Integral a => a -> Int8
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int8)
sCmpOp (ITFixed NativeTy
IT16) 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` (a -> Int16
forall {a}. Integral a => a -> Int16
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int16)
sCmpOp (ITFixed NativeTy
IT32) 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` (a -> Int32
forall {a}. Integral a => a -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int32)
sCmpOp (ITFixed NativeTy
IT64) 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` (a -> Int64
forall {a}. Integral a => a -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Integral a => a -> Int64)
sCmpOp IntTy
_ 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 :: forall a. Integral a => IntTy -> a -> Const
toInt (ITFixed NativeTy
IT8)      a
x = Word8 -> Const
B8 (a -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt (ITFixed NativeTy
IT16)     a
x = Word16 -> Const
B16 (a -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt (ITFixed NativeTy
IT32)     a
x = Word32 -> Const
B32 (a -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt (ITFixed NativeTy
IT64)     a
x = Word64 -> Const
B64 (a -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt IntTy
ITBig    a
x = Integer -> Const
BI (a -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt IntTy
ITNative a
x = Int -> Const
I (a -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x)
toInt IntTy
ITChar 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 NativeTy
IT8)      IntTy
out [B8  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 NativeTy
IT16)     IntTy
out [B16 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 NativeTy
IT32)     IntTy
out [B32 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 NativeTy
IT64)     IntTy
out [B64 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 IntTy
ITBig              IntTy
out [BI  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 IntTy
ITNative           IntTy
out [I   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 IntTy
ITChar             IntTy
out [Ch  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 IntTy
_ IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

zext :: IntTy -> IntTy -> [Const] -> Maybe Const
zext :: IntTy -> IntTy -> [Const] -> Maybe Const
zext IntTy
from IntTy
ITBig [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
from IntTy
ITBig [Const]
val
zext IntTy
ITBig IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
zext f :: IntTy
f@(ITFixed NativeTy
from) t :: IntTy
t@(ITFixed NativeTy
to) [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 IntTy
ITNative IntTy
to [I 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 IntTy
from IntTy
ITNative [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
from IntTy
ITNative [Const]
val
zext IntTy
_ IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

sext :: IntTy -> IntTy -> [Const] -> Maybe Const
sext :: IntTy -> IntTy -> [Const] -> Maybe Const
sext (ITFixed NativeTy
IT8)  IntTy
out [B8  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 NativeTy
IT16) IntTy
out [B16 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 NativeTy
IT32) IntTy
out [B32 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 NativeTy
IT64) IntTy
out [B64 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 IntTy
ITBig IntTy
_  [Const]
_       = Maybe Const
forall a. Maybe a
Nothing
sext IntTy
from IntTy
to  [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 IntTy
ITBig IntTy
to [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
ITBig IntTy
to [Const]
val
trunc IntTy
_ IntTy
ITBig [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
trunc f :: IntTy
f@(ITFixed NativeTy
from) t :: IntTy
t@(ITFixed NativeTy
to) [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 IntTy
ITNative IntTy
to [I 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 IntTy
from IntTy
ITNative [Const]
val = IntTy -> IntTy -> [Const] -> Maybe Const
intToInt IntTy
from IntTy
ITNative [Const]
val
trunc IntTy
_ IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

intToStr :: [Const] -> Maybe Const
intToStr :: [Const] -> Maybe Const
intToStr [Const]
val | [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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

getInt :: [Const] -> [Integer]
getInt :: [Const] -> [Integer]
getInt (B8 Word8
x : [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 Word16
x : [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 Word32
x : [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 Word64
x : [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 Int
x : [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 Integer
x : [Const]
xs) = Integer
x Integer -> [Integer] -> [Integer]
forall a. a -> [a] -> [a]
: [Const] -> [Integer]
getInt [Const]
xs
getInt [Const]
_ = []

strToInt :: IntTy -> [Const] -> Maybe Const
strToInt :: IntTy -> [Const] -> Maybe Const
strToInt IntTy
ity [Str 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
                         [(Integer
n,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 Int
0
                         [(Integer, String)]
_       -> 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
0
  where
    dropFirstPlus :: String -> String
    dropFirstPlus :: String -> String
dropFirstPlus (Char
'+' : String
str) = String
str
    dropFirstPlus String
str = String
str
strToInt IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

intToFloat :: [Const] -> Maybe Const
intToFloat :: [Const] -> Maybe Const
intToFloat [Const]
val | [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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

floatToInt :: IntTy -> [Const] -> Maybe Const
floatToInt :: IntTy -> [Const] -> Maybe Const
floatToInt IntTy
ity [Fl 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 b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
truncate Double
x :: Integer)
floatToInt IntTy
_ [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

c_intToChar, c_charToInt :: [Const] -> Maybe Const
c_intToChar :: [Const] -> Maybe Const
c_intToChar [(I 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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
c_charToInt :: [Const] -> Maybe Const
c_charToInt [(Ch 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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

c_negFloat :: [Const] -> Maybe Const
c_negFloat :: [Const] -> Maybe Const
c_negFloat [Fl 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 [Const]
_      = Maybe Const
forall a. Maybe a
Nothing

c_floatToStr :: [Const] -> Maybe Const
c_floatToStr :: [Const] -> Maybe Const
c_floatToStr [Fl 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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
c_strToFloat :: [Const] -> Maybe Const
c_strToFloat [Str String
x] = case ReadS Double
forall a. Read a => ReadS a
reads String
x of
                         [(Double
n,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 Double
0)
                         [(Double, String)]
_       -> 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
0
c_strToFloat [Const]
_ = Maybe Const
forall a. Maybe a
Nothing

p_fPrim :: (Double -> Double) -> [Const] -> Maybe Const
p_fPrim :: (Double -> Double) -> [Const] -> Maybe Const
p_fPrim Double -> Double
f [Fl 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 Double -> Double
f [Const]
_ = 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 b. Integral b => Double -> b
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 b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
ceiling)

p_floatATan2 :: [Const] -> Maybe Const
p_floatATan2 :: [Const] -> Maybe Const
p_floatATan2 [Fl Double
y, Fl 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 [Const]
_ = 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 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 a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
xs)
p_strLen [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
p_strHead :: [Const] -> Maybe Const
p_strHead [Str (Char
x: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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
p_strTail :: [Const] -> Maybe Const
p_strTail [Str (Char
x: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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
p_strIndex :: [Const] -> Maybe Const
p_strIndex [Str String
xs, I Int
i]
   | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< String -> Int
forall a. [a] -> 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. HasCallStack => [a] -> Int -> a
!!Int
i)
p_strIndex [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
p_strCons :: [Const] -> Maybe Const
p_strCons [Ch Char
x, Str 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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
p_strRev :: [Const] -> Maybe Const
p_strRev [Str 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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing
p_strSubstr :: [Const] -> Maybe Const
p_strSubstr [I Int
offset, I Int
length, Str 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 [Const]
_ = Maybe Const
forall a. Maybe a
Nothing


p_cantreduce :: a -> Maybe b
p_cantreduce :: forall a b. a -> Maybe b
p_cantreduce a
_ = Maybe b
forall a. Maybe a
Nothing