{-# LANGUAGE DataKinds, MultiParamTypeClasses, TypeFamilies #-}
module Michelson.Typed.Arith
( ArithOp (..)
, UnaryArithOp (..)
, ArithError (..)
, ArithErrorType (..)
, Add
, Sub
, Mul
, Abs
, Neg
, Or
, And
, Xor
, Not
, Lsl
, Lsr
, Compare
, Eq'
, Neq
, Lt
, Gt
, Le
, Ge
, compareOp
) where
import Data.Bits (complement, shift, (.&.), (.|.))
import Data.Singletons (Sing, SingI(..))
import Fmt (Buildable(build))
import Michelson.Typed.Sing (SingT(..))
import Michelson.Typed.T (T(..))
import Michelson.Typed.Value (Comparable, Comparability(..), checkComparability, Value'(..))
import Tezos.Core (addMutez, mulMutez, subMutez, timestampFromSeconds, timestampToSeconds)
class ArithOp aop (n :: T) (m :: T) where
type ArithRes aop n m :: T
evalOp
:: proxy aop
-> Value' instr n
-> Value' instr m
-> Either (ArithError (Value' instr n) (Value' instr m)) (Value' instr (ArithRes aop n m))
data ArithErrorType
= AddOverflow
| MulOverflow
| SubUnderflow
| LslOverflow
| LsrUnderflow
deriving stock (Int -> ArithErrorType -> ShowS
[ArithErrorType] -> ShowS
ArithErrorType -> String
(Int -> ArithErrorType -> ShowS)
-> (ArithErrorType -> String)
-> ([ArithErrorType] -> ShowS)
-> Show ArithErrorType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ArithErrorType] -> ShowS
$cshowList :: [ArithErrorType] -> ShowS
show :: ArithErrorType -> String
$cshow :: ArithErrorType -> String
showsPrec :: Int -> ArithErrorType -> ShowS
$cshowsPrec :: Int -> ArithErrorType -> ShowS
Show, ArithErrorType -> ArithErrorType -> Bool
(ArithErrorType -> ArithErrorType -> Bool)
-> (ArithErrorType -> ArithErrorType -> Bool) -> Eq ArithErrorType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ArithErrorType -> ArithErrorType -> Bool
$c/= :: ArithErrorType -> ArithErrorType -> Bool
== :: ArithErrorType -> ArithErrorType -> Bool
$c== :: ArithErrorType -> ArithErrorType -> Bool
Eq, Eq ArithErrorType
Eq ArithErrorType =>
(ArithErrorType -> ArithErrorType -> Ordering)
-> (ArithErrorType -> ArithErrorType -> Bool)
-> (ArithErrorType -> ArithErrorType -> Bool)
-> (ArithErrorType -> ArithErrorType -> Bool)
-> (ArithErrorType -> ArithErrorType -> Bool)
-> (ArithErrorType -> ArithErrorType -> ArithErrorType)
-> (ArithErrorType -> ArithErrorType -> ArithErrorType)
-> Ord ArithErrorType
ArithErrorType -> ArithErrorType -> Bool
ArithErrorType -> ArithErrorType -> Ordering
ArithErrorType -> ArithErrorType -> ArithErrorType
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ArithErrorType -> ArithErrorType -> ArithErrorType
$cmin :: ArithErrorType -> ArithErrorType -> ArithErrorType
max :: ArithErrorType -> ArithErrorType -> ArithErrorType
$cmax :: ArithErrorType -> ArithErrorType -> ArithErrorType
>= :: ArithErrorType -> ArithErrorType -> Bool
$c>= :: ArithErrorType -> ArithErrorType -> Bool
> :: ArithErrorType -> ArithErrorType -> Bool
$c> :: ArithErrorType -> ArithErrorType -> Bool
<= :: ArithErrorType -> ArithErrorType -> Bool
$c<= :: ArithErrorType -> ArithErrorType -> Bool
< :: ArithErrorType -> ArithErrorType -> Bool
$c< :: ArithErrorType -> ArithErrorType -> Bool
compare :: ArithErrorType -> ArithErrorType -> Ordering
$ccompare :: ArithErrorType -> ArithErrorType -> Ordering
$cp1Ord :: Eq ArithErrorType
Ord, (forall x. ArithErrorType -> Rep ArithErrorType x)
-> (forall x. Rep ArithErrorType x -> ArithErrorType)
-> Generic ArithErrorType
forall x. Rep ArithErrorType x -> ArithErrorType
forall x. ArithErrorType -> Rep ArithErrorType x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ArithErrorType x -> ArithErrorType
$cfrom :: forall x. ArithErrorType -> Rep ArithErrorType x
Generic)
instance NFData ArithErrorType
data ArithError n m
= MutezArithError ArithErrorType n m
| ShiftArithError ArithErrorType n m
deriving stock (Int -> ArithError n m -> ShowS
[ArithError n m] -> ShowS
ArithError n m -> String
(Int -> ArithError n m -> ShowS)
-> (ArithError n m -> String)
-> ([ArithError n m] -> ShowS)
-> Show (ArithError n m)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall n m. (Show n, Show m) => Int -> ArithError n m -> ShowS
forall n m. (Show n, Show m) => [ArithError n m] -> ShowS
forall n m. (Show n, Show m) => ArithError n m -> String
showList :: [ArithError n m] -> ShowS
$cshowList :: forall n m. (Show n, Show m) => [ArithError n m] -> ShowS
show :: ArithError n m -> String
$cshow :: forall n m. (Show n, Show m) => ArithError n m -> String
showsPrec :: Int -> ArithError n m -> ShowS
$cshowsPrec :: forall n m. (Show n, Show m) => Int -> ArithError n m -> ShowS
Show, ArithError n m -> ArithError n m -> Bool
(ArithError n m -> ArithError n m -> Bool)
-> (ArithError n m -> ArithError n m -> Bool)
-> Eq (ArithError n m)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall n m.
(Eq n, Eq m) =>
ArithError n m -> ArithError n m -> Bool
/= :: ArithError n m -> ArithError n m -> Bool
$c/= :: forall n m.
(Eq n, Eq m) =>
ArithError n m -> ArithError n m -> Bool
== :: ArithError n m -> ArithError n m -> Bool
$c== :: forall n m.
(Eq n, Eq m) =>
ArithError n m -> ArithError n m -> Bool
Eq, Eq (ArithError n m)
Eq (ArithError n m) =>
(ArithError n m -> ArithError n m -> Ordering)
-> (ArithError n m -> ArithError n m -> Bool)
-> (ArithError n m -> ArithError n m -> Bool)
-> (ArithError n m -> ArithError n m -> Bool)
-> (ArithError n m -> ArithError n m -> Bool)
-> (ArithError n m -> ArithError n m -> ArithError n m)
-> (ArithError n m -> ArithError n m -> ArithError n m)
-> Ord (ArithError n m)
ArithError n m -> ArithError n m -> Bool
ArithError n m -> ArithError n m -> Ordering
ArithError n m -> ArithError n m -> ArithError n m
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall n m. (Ord n, Ord m) => Eq (ArithError n m)
forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> Bool
forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> Ordering
forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> ArithError n m
min :: ArithError n m -> ArithError n m -> ArithError n m
$cmin :: forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> ArithError n m
max :: ArithError n m -> ArithError n m -> ArithError n m
$cmax :: forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> ArithError n m
>= :: ArithError n m -> ArithError n m -> Bool
$c>= :: forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> Bool
> :: ArithError n m -> ArithError n m -> Bool
$c> :: forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> Bool
<= :: ArithError n m -> ArithError n m -> Bool
$c<= :: forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> Bool
< :: ArithError n m -> ArithError n m -> Bool
$c< :: forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> Bool
compare :: ArithError n m -> ArithError n m -> Ordering
$ccompare :: forall n m.
(Ord n, Ord m) =>
ArithError n m -> ArithError n m -> Ordering
$cp1Ord :: forall n m. (Ord n, Ord m) => Eq (ArithError n m)
Ord, (forall x. ArithError n m -> Rep (ArithError n m) x)
-> (forall x. Rep (ArithError n m) x -> ArithError n m)
-> Generic (ArithError n m)
forall x. Rep (ArithError n m) x -> ArithError n m
forall x. ArithError n m -> Rep (ArithError n m) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall n m x. Rep (ArithError n m) x -> ArithError n m
forall n m x. ArithError n m -> Rep (ArithError n m) x
$cto :: forall n m x. Rep (ArithError n m) x -> ArithError n m
$cfrom :: forall n m x. ArithError n m -> Rep (ArithError n m) x
Generic)
instance (NFData n, NFData m) => NFData (ArithError n m)
class UnaryArithOp aop (n :: T) where
type UnaryArithRes aop n :: T
evalUnaryArithOp :: proxy aop -> Value' instr n -> Value' instr (UnaryArithRes aop n)
data Add
data Sub
data Mul
data Abs
data Neg
data Or
data And
data Xor
data Not
data Lsl
data Lsr
data Compare
data Eq'
data Neq
data Lt
data Gt
data Le
data Ge
instance ArithOp Add 'TNat 'TInt where
type ArithRes Add 'TNat 'TInt = 'TInt
evalOp :: proxy Add
-> Value' instr 'TNat
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TNat 'TInt))
evalOp _ (VNat i :: Natural
i) (VInt j :: Integer
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TNat 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TNat 'TInt)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TNat 'TInt))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
j)
instance ArithOp Add 'TInt 'TNat where
type ArithRes Add 'TInt 'TNat = 'TInt
evalOp :: proxy Add
-> Value' instr 'TInt
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TInt 'TNat))
evalOp _ (VInt i :: Integer
i) (VNat j :: Natural
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TInt 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TInt 'TNat)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TInt 'TNat))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
j)
instance ArithOp Add 'TNat 'TNat where
type ArithRes Add 'TNat 'TNat = 'TNat
evalOp :: proxy Add
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TNat 'TNat))
evalOp _ (VNat i :: Natural
i) (VNat j :: Natural
j) = Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TNat 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Add 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Natural
i Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
+ Natural
j)
instance ArithOp Add 'TInt 'TInt where
type ArithRes Add 'TInt 'TInt = 'TInt
evalOp :: proxy Add
-> Value' instr 'TInt
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TInt 'TInt))
evalOp _ (VInt i :: Integer
i) (VInt j :: Integer
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TInt 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TInt 'TInt)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TInt 'TInt))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
j)
instance ArithOp Add 'TTimestamp 'TInt where
type ArithRes Add 'TTimestamp 'TInt = 'TTimestamp
evalOp :: proxy Add
-> Value' instr 'TTimestamp
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TTimestamp 'TInt))
evalOp _ (VTimestamp i :: Timestamp
i) (VInt j :: Integer
j) =
Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TTimestamp 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TTimestamp 'TInt)))
-> Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Add 'TTimestamp 'TInt))
forall a b. (a -> b) -> a -> b
$ Timestamp -> Value' instr 'TTimestamp
forall (instr :: [T] -> [T] -> *).
Timestamp -> Value' instr 'TTimestamp
VTimestamp (Timestamp -> Value' instr 'TTimestamp)
-> Timestamp -> Value' instr 'TTimestamp
forall a b. (a -> b) -> a -> b
$ Integer -> Timestamp
timestampFromSeconds (Integer -> Timestamp) -> Integer -> Timestamp
forall a b. (a -> b) -> a -> b
$ Timestamp -> Integer
forall a. Integral a => Timestamp -> a
timestampToSeconds Timestamp
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
j
instance ArithOp Add 'TInt 'TTimestamp where
type ArithRes Add 'TInt 'TTimestamp = 'TTimestamp
evalOp :: proxy Add
-> Value' instr 'TInt
-> Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Add 'TInt 'TTimestamp))
evalOp _ (VInt i :: Integer
i) (VTimestamp j :: Timestamp
j) =
Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Add 'TInt 'TTimestamp))
forall a b. b -> Either a b
Right (Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Add 'TInt 'TTimestamp)))
-> Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Add 'TInt 'TTimestamp))
forall a b. (a -> b) -> a -> b
$ Timestamp -> Value' instr 'TTimestamp
forall (instr :: [T] -> [T] -> *).
Timestamp -> Value' instr 'TTimestamp
VTimestamp (Timestamp -> Value' instr 'TTimestamp)
-> Timestamp -> Value' instr 'TTimestamp
forall a b. (a -> b) -> a -> b
$ Integer -> Timestamp
timestampFromSeconds (Integer -> Timestamp) -> Integer -> Timestamp
forall a b. (a -> b) -> a -> b
$ Timestamp -> Integer
forall a. Integral a => Timestamp -> a
timestampToSeconds Timestamp
j Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
i
instance ArithOp Add 'TMutez 'TMutez where
type ArithRes Add 'TMutez 'TMutez = 'TMutez
evalOp :: proxy Add
-> Value' instr 'TMutez
-> Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr (ArithRes Add 'TMutez 'TMutez))
evalOp _ n :: Value' instr 'TMutez
n@(VMutez i :: Mutez
i) m :: Value' instr 'TMutez
m@(VMutez j :: Mutez
j) = Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr (ArithRes Add 'TMutez 'TMutez))
res
where
res :: Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
res = Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
-> (Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. a -> Either a b
Left (ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ ArithErrorType
-> Value' instr 'TMutez
-> Value' instr 'TMutez
-> ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
forall n m. ArithErrorType -> n -> m -> ArithError n m
MutezArithError ArithErrorType
AddOverflow Value' instr 'TMutez
n Value' instr 'TMutez
m) (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. b -> Either a b
Right (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> (Mutez -> Value' instr 'TMutez)
-> Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mutez -> Value' instr 'TMutez
forall (instr :: [T] -> [T] -> *). Mutez -> Value' instr 'TMutez
VMutez) (Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ Mutez
i Mutez -> Mutez -> Maybe Mutez
`addMutez` Mutez
j
instance ArithOp Sub 'TNat 'TInt where
type ArithRes Sub 'TNat 'TInt = 'TInt
evalOp :: proxy Sub
-> Value' instr 'TNat
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TNat 'TInt))
evalOp _ (VNat i :: Natural
i) (VInt j :: Integer
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TNat 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TNat 'TInt)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TNat 'TInt))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
j)
instance ArithOp Sub 'TInt 'TNat where
type ArithRes Sub 'TInt 'TNat = 'TInt
evalOp :: proxy Sub
-> Value' instr 'TInt
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TInt 'TNat))
evalOp _ (VInt i :: Integer
i) (VNat j :: Natural
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TInt 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TInt 'TNat)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TInt 'TNat))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
j)
instance ArithOp Sub 'TNat 'TNat where
type ArithRes Sub 'TNat 'TNat = 'TInt
evalOp :: proxy Sub
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TNat 'TNat))
evalOp _ (VNat i :: Natural
i) (VNat j :: Natural
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TNat 'TNat)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Sub 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
j)
instance ArithOp Sub 'TInt 'TInt where
type ArithRes Sub 'TInt 'TInt = 'TInt
evalOp :: proxy Sub
-> Value' instr 'TInt
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TInt 'TInt))
evalOp _ (VInt i :: Integer
i) (VInt j :: Integer
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TInt 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TInt 'TInt)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TInt 'TInt))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
j)
instance ArithOp Sub 'TTimestamp 'TInt where
type ArithRes Sub 'TTimestamp 'TInt = 'TTimestamp
evalOp :: proxy Sub
-> Value' instr 'TTimestamp
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TTimestamp 'TInt))
evalOp _ (VTimestamp i :: Timestamp
i) (VInt j :: Integer
j) =
Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TTimestamp 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TTimestamp 'TInt)))
-> Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TInt))
(Value' instr (ArithRes Sub 'TTimestamp 'TInt))
forall a b. (a -> b) -> a -> b
$ Timestamp -> Value' instr 'TTimestamp
forall (instr :: [T] -> [T] -> *).
Timestamp -> Value' instr 'TTimestamp
VTimestamp (Timestamp -> Value' instr 'TTimestamp)
-> Timestamp -> Value' instr 'TTimestamp
forall a b. (a -> b) -> a -> b
$ Integer -> Timestamp
timestampFromSeconds (Integer -> Timestamp) -> Integer -> Timestamp
forall a b. (a -> b) -> a -> b
$ Timestamp -> Integer
forall a. Integral a => Timestamp -> a
timestampToSeconds Timestamp
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
j
instance ArithOp Sub 'TTimestamp 'TTimestamp where
type ArithRes Sub 'TTimestamp 'TTimestamp = 'TInt
evalOp :: proxy Sub
-> Value' instr 'TTimestamp
-> Value' instr 'TTimestamp
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Sub 'TTimestamp 'TTimestamp))
evalOp _ (VTimestamp i :: Timestamp
i) (VTimestamp j :: Timestamp
j) =
Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Sub 'TTimestamp 'TTimestamp))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Sub 'TTimestamp 'TTimestamp)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TTimestamp) (Value' instr 'TTimestamp))
(Value' instr (ArithRes Sub 'TTimestamp 'TTimestamp))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer -> Value' instr 'TInt) -> Integer -> Value' instr 'TInt
forall a b. (a -> b) -> a -> b
$ Timestamp -> Integer
forall a. Integral a => Timestamp -> a
timestampToSeconds Timestamp
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Timestamp -> Integer
forall a. Integral a => Timestamp -> a
timestampToSeconds Timestamp
j
instance ArithOp Sub 'TMutez 'TMutez where
type ArithRes Sub 'TMutez 'TMutez = 'TMutez
evalOp :: proxy Sub
-> Value' instr 'TMutez
-> Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr (ArithRes Sub 'TMutez 'TMutez))
evalOp _ n :: Value' instr 'TMutez
n@(VMutez i :: Mutez
i) m :: Value' instr 'TMutez
m@(VMutez j :: Mutez
j) = Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr (ArithRes Sub 'TMutez 'TMutez))
res
where
res :: Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
res = Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
-> (Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. a -> Either a b
Left (ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ ArithErrorType
-> Value' instr 'TMutez
-> Value' instr 'TMutez
-> ArithError (Value' instr 'TMutez) (Value' instr 'TMutez)
forall n m. ArithErrorType -> n -> m -> ArithError n m
MutezArithError ArithErrorType
SubUnderflow Value' instr 'TMutez
n Value' instr 'TMutez
m) (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. b -> Either a b
Right (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> (Mutez -> Value' instr 'TMutez)
-> Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mutez -> Value' instr 'TMutez
forall (instr :: [T] -> [T] -> *). Mutez -> Value' instr 'TMutez
VMutez) (Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ Mutez
i Mutez -> Mutez -> Maybe Mutez
`subMutez` Mutez
j
instance ArithOp Mul 'TNat 'TInt where
type ArithRes Mul 'TNat 'TInt = 'TInt
evalOp :: proxy Mul
-> Value' instr 'TNat
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TNat 'TInt))
evalOp _ (VNat i :: Natural
i) (VInt j :: Integer
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TNat 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TNat 'TInt)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TNat 'TInt))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
j)
instance ArithOp Mul 'TInt 'TNat where
type ArithRes Mul 'TInt 'TNat = 'TInt
evalOp :: proxy Mul
-> Value' instr 'TInt
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TInt 'TNat))
evalOp _ (VInt i :: Integer
i) (VNat j :: Natural
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TInt 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TInt 'TNat)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TInt 'TNat))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
j)
instance ArithOp Mul 'TNat 'TNat where
type ArithRes Mul 'TNat 'TNat = 'TNat
evalOp :: proxy Mul
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TNat 'TNat))
evalOp _ (VNat i :: Natural
i) (VNat j :: Natural
j) = Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TNat 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Natural
i Natural -> Natural -> Natural
forall a. Num a => a -> a -> a
* Natural
j)
instance ArithOp Mul 'TInt 'TInt where
type ArithRes Mul 'TInt 'TInt = 'TInt
evalOp :: proxy Mul
-> Value' instr 'TInt
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TInt 'TInt))
evalOp _ (VInt i :: Integer
i) (VInt j :: Integer
j) = Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TInt 'TInt))
forall a b. b -> Either a b
Right (Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TInt 'TInt)))
-> Value' instr 'TInt
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TInt))
(Value' instr (ArithRes Mul 'TInt 'TInt))
forall a b. (a -> b) -> a -> b
$ Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer
i Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
* Integer
j)
instance ArithOp Mul 'TNat 'TMutez where
type ArithRes Mul 'TNat 'TMutez = 'TMutez
evalOp :: proxy Mul
-> Value' instr 'TNat
-> Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr (ArithRes Mul 'TNat 'TMutez))
evalOp _ n :: Value' instr 'TNat
n@(VNat i :: Natural
i) m :: Value' instr 'TMutez
m@(VMutez j :: Mutez
j) = Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr (ArithRes Mul 'TNat 'TMutez))
res
where
res :: Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
res = Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
-> (Mutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (ArithError (Value' instr 'TNat) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. a -> Either a b
Left (ArithError (Value' instr 'TNat) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> ArithError (Value' instr 'TNat) (Value' instr 'TMutez)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ ArithErrorType
-> Value' instr 'TNat
-> Value' instr 'TMutez
-> ArithError (Value' instr 'TNat) (Value' instr 'TMutez)
forall n m. ArithErrorType -> n -> m -> ArithError n m
MutezArithError ArithErrorType
MulOverflow Value' instr 'TNat
n Value' instr 'TMutez
m) (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. b -> Either a b
Right (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> (Mutez -> Value' instr 'TMutez)
-> Mutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mutez -> Value' instr 'TMutez
forall (instr :: [T] -> [T] -> *). Mutez -> Value' instr 'TMutez
VMutez) (Maybe Mutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TMutez))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ Mutez
j Mutez -> Natural -> Maybe Mutez
forall a. Integral a => Mutez -> a -> Maybe Mutez
`mulMutez` Natural
i
instance ArithOp Mul 'TMutez 'TNat where
type ArithRes Mul 'TMutez 'TNat = 'TMutez
evalOp :: proxy Mul
-> Value' instr 'TMutez
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TMutez 'TNat))
evalOp _ n :: Value' instr 'TMutez
n@(VMutez i :: Mutez
i) m :: Value' instr 'TNat
m@(VNat j :: Natural
j) = Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr (ArithRes Mul 'TMutez 'TNat))
res
where
res :: Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
res = Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
-> (Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (ArithError (Value' instr 'TMutez) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
forall a b. a -> Either a b
Left (ArithError (Value' instr 'TMutez) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez))
-> ArithError (Value' instr 'TMutez) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ ArithErrorType
-> Value' instr 'TMutez
-> Value' instr 'TNat
-> ArithError (Value' instr 'TMutez) (Value' instr 'TNat)
forall n m. ArithErrorType -> n -> m -> ArithError n m
MutezArithError ArithErrorType
MulOverflow Value' instr 'TMutez
n Value' instr 'TNat
m) (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
forall a b. b -> Either a b
Right (Value' instr 'TMutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez))
-> (Mutez -> Value' instr 'TMutez)
-> Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Mutez -> Value' instr 'TMutez
forall (instr :: [T] -> [T] -> *). Mutez -> Value' instr 'TMutez
VMutez) (Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez))
-> Maybe Mutez
-> Either
(ArithError (Value' instr 'TMutez) (Value' instr 'TNat))
(Value' instr 'TMutez)
forall a b. (a -> b) -> a -> b
$ Mutez
i Mutez -> Natural -> Maybe Mutez
forall a. Integral a => Mutez -> a -> Maybe Mutez
`mulMutez` Natural
j
instance UnaryArithOp Abs 'TInt where
type UnaryArithRes Abs 'TInt = 'TNat
evalUnaryArithOp :: proxy Abs
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Abs 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Integer -> Natural
forall a. Num a => Integer -> a
fromInteger (Integer -> Natural) -> Integer -> Natural
forall a b. (a -> b) -> a -> b
$ Integer -> Integer
forall a. Num a => a -> a
abs Integer
i)
instance UnaryArithOp Neg 'TInt where
type UnaryArithRes Neg 'TInt = 'TInt
evalUnaryArithOp :: proxy Neg
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Neg 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (-Integer
i)
instance UnaryArithOp Neg 'TNat where
type UnaryArithRes Neg 'TNat = 'TInt
evalUnaryArithOp :: proxy Neg
-> Value' instr 'TNat -> Value' instr (UnaryArithRes Neg 'TNat)
evalUnaryArithOp _ (VNat i :: Natural
i) = Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (- Natural -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
i)
instance ArithOp Or 'TNat 'TNat where
type ArithRes Or 'TNat 'TNat = 'TNat
evalOp :: proxy Or
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Or 'TNat 'TNat))
evalOp _ (VNat i :: Natural
i) (VNat j :: Natural
j) = Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Or 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Or 'TNat 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Or 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Natural
i Natural -> Natural -> Natural
forall a. Bits a => a -> a -> a
.|. Natural
j)
instance ArithOp Or 'TBool 'TBool where
type ArithRes Or 'TBool 'TBool = 'TBool
evalOp :: proxy Or
-> Value' instr 'TBool
-> Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Or 'TBool 'TBool))
evalOp _ (VBool i :: Bool
i) (VBool j :: Bool
j) = Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Or 'TBool 'TBool))
forall a b. b -> Either a b
Right (Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Or 'TBool 'TBool)))
-> Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Or 'TBool 'TBool))
forall a b. (a -> b) -> a -> b
$ Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Bool
i Bool -> Bool -> Bool
forall a. Bits a => a -> a -> a
.|. Bool
j)
instance ArithOp And 'TInt 'TNat where
type ArithRes And 'TInt 'TNat = 'TNat
evalOp :: proxy And
-> Value' instr 'TInt
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TInt 'TNat))
evalOp _ (VInt i :: Integer
i) (VNat j :: Natural
j) = Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TInt 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TInt 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TInt) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TInt 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat ((Integer -> Natural
forall a. Num a => Integer -> a
fromInteger Integer
i) Natural -> Natural -> Natural
forall a. Bits a => a -> a -> a
.&. Natural
j)
instance ArithOp And 'TNat 'TNat where
type ArithRes And 'TNat 'TNat = 'TNat
evalOp :: proxy And
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TNat 'TNat))
evalOp _ (VNat i :: Natural
i) (VNat j :: Natural
j) = Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TNat 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes And 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Natural
i Natural -> Natural -> Natural
forall a. Bits a => a -> a -> a
.&. Natural
j)
instance ArithOp And 'TBool 'TBool where
type ArithRes And 'TBool 'TBool = 'TBool
evalOp :: proxy And
-> Value' instr 'TBool
-> Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes And 'TBool 'TBool))
evalOp _ (VBool i :: Bool
i) (VBool j :: Bool
j) = Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes And 'TBool 'TBool))
forall a b. b -> Either a b
Right (Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes And 'TBool 'TBool)))
-> Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes And 'TBool 'TBool))
forall a b. (a -> b) -> a -> b
$ Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Bool
i Bool -> Bool -> Bool
forall a. Bits a => a -> a -> a
.&. Bool
j)
instance ArithOp Xor 'TNat 'TNat where
type ArithRes Xor 'TNat 'TNat = 'TNat
evalOp :: proxy Xor
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Xor 'TNat 'TNat))
evalOp _ (VNat i :: Natural
i) (VNat j :: Natural
j) = Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Xor 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Xor 'TNat 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Xor 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Natural
i Natural -> Natural -> Natural
forall a. Bits a => a -> a -> a
`xor` Natural
j)
instance ArithOp Xor 'TBool 'TBool where
type ArithRes Xor 'TBool 'TBool = 'TBool
evalOp :: proxy Xor
-> Value' instr 'TBool
-> Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Xor 'TBool 'TBool))
evalOp _ (VBool i :: Bool
i) (VBool j :: Bool
j) = Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Xor 'TBool 'TBool))
forall a b. b -> Either a b
Right (Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Xor 'TBool 'TBool)))
-> Value' instr 'TBool
-> Either
(ArithError (Value' instr 'TBool) (Value' instr 'TBool))
(Value' instr (ArithRes Xor 'TBool 'TBool))
forall a b. (a -> b) -> a -> b
$ Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Bool
i Bool -> Bool -> Bool
forall a. Bits a => a -> a -> a
`xor` Bool
j)
instance ArithOp Lsl 'TNat 'TNat where
type ArithRes Lsl 'TNat 'TNat = 'TNat
evalOp :: proxy Lsl
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsl 'TNat 'TNat))
evalOp _ n :: Value' instr 'TNat
n@(VNat i :: Natural
i) m :: Value' instr 'TNat
m@(VNat j :: Natural
j) =
if Natural
j Natural -> Natural -> Bool
forall a. Ord a => a -> a -> Bool
> 256
then ArithError (Value' instr 'TNat) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsl 'TNat 'TNat))
forall a b. a -> Either a b
Left (ArithError (Value' instr 'TNat) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsl 'TNat 'TNat)))
-> ArithError (Value' instr 'TNat) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsl 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ ArithErrorType
-> Value' instr 'TNat
-> Value' instr 'TNat
-> ArithError (Value' instr 'TNat) (Value' instr 'TNat)
forall n m. ArithErrorType -> n -> m -> ArithError n m
ShiftArithError ArithErrorType
LslOverflow Value' instr 'TNat
n Value' instr 'TNat
m
else Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsl 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsl 'TNat 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsl 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Integer -> Natural
forall a. Num a => Integer -> a
fromInteger (Integer -> Natural) -> Integer -> Natural
forall a b. (a -> b) -> a -> b
$ Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
shift (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
i) (Natural -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
j))
instance ArithOp Lsr 'TNat 'TNat where
type ArithRes Lsr 'TNat 'TNat = 'TNat
evalOp :: proxy Lsr
-> Value' instr 'TNat
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsr 'TNat 'TNat))
evalOp _ n :: Value' instr 'TNat
n@(VNat i :: Natural
i) m :: Value' instr 'TNat
m@(VNat j :: Natural
j) =
if Natural
j Natural -> Natural -> Bool
forall a. Ord a => a -> a -> Bool
> 256
then ArithError (Value' instr 'TNat) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsr 'TNat 'TNat))
forall a b. a -> Either a b
Left (ArithError (Value' instr 'TNat) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsr 'TNat 'TNat)))
-> ArithError (Value' instr 'TNat) (Value' instr 'TNat)
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsr 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ ArithErrorType
-> Value' instr 'TNat
-> Value' instr 'TNat
-> ArithError (Value' instr 'TNat) (Value' instr 'TNat)
forall n m. ArithErrorType -> n -> m -> ArithError n m
ShiftArithError ArithErrorType
LsrUnderflow Value' instr 'TNat
n Value' instr 'TNat
m
else Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsr 'TNat 'TNat))
forall a b. b -> Either a b
Right (Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsr 'TNat 'TNat)))
-> Value' instr 'TNat
-> Either
(ArithError (Value' instr 'TNat) (Value' instr 'TNat))
(Value' instr (ArithRes Lsr 'TNat 'TNat))
forall a b. (a -> b) -> a -> b
$ Natural -> Value' instr 'TNat
forall (instr :: [T] -> [T] -> *). Natural -> Value' instr 'TNat
VNat (Integer -> Natural
forall a. Num a => Integer -> a
fromInteger (Integer -> Natural) -> Integer -> Natural
forall a b. (a -> b) -> a -> b
$ Integer -> Int -> Integer
forall a. Bits a => a -> Int -> a
shift (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
i) (-(Natural -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Natural
j)))
instance UnaryArithOp Not 'TInt where
type UnaryArithRes Not 'TInt = 'TInt
evalUnaryArithOp :: proxy Not
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Not 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer -> Integer
forall a. Bits a => a -> a
complement Integer
i)
instance UnaryArithOp Not 'TNat where
type UnaryArithRes Not 'TNat = 'TInt
evalUnaryArithOp :: proxy Not
-> Value' instr 'TNat -> Value' instr (UnaryArithRes Not 'TNat)
evalUnaryArithOp _ (VNat i :: Natural
i) = Integer -> Value' instr 'TInt
forall (instr :: [T] -> [T] -> *). Integer -> Value' instr 'TInt
VInt (Integer -> Integer
forall a. Bits a => a -> a
complement (Integer -> Integer) -> Integer -> Integer
forall a b. (a -> b) -> a -> b
$ Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
i)
instance UnaryArithOp Not 'TBool where
type UnaryArithRes Not 'TBool = 'TBool
evalUnaryArithOp :: proxy Not
-> Value' instr 'TBool -> Value' instr (UnaryArithRes Not 'TBool)
evalUnaryArithOp _ (VBool i :: Bool
i) = Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Bool -> Bool
not Bool
i)
compareOp :: forall t i. (Comparable t, SingI t) => Value' i t -> Value' i t -> Integer
compareOp :: Value' i t -> Value' i t -> Integer
compareOp a' :: Value' i t
a' b' :: Value' i t
b' = case (Sing t
forall k (a :: k). SingI a => Sing a
sing :: Sing t, Value' i t
a', Value' i t
b') of
(STInt, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STNat, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STString, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STBytes, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STMutez, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STBool, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STKeyHash, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STTimestamp, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STAddress, i :: Value' i t
i, j :: Value' i t
j) -> Int -> Integer
forall a. Integral a => a -> Integer
toInteger (Int -> Integer) -> Int -> Integer
forall a b. (a -> b) -> a -> b
$ Ordering -> Int
forall a. Enum a => a -> Int
fromEnum (Value' i t -> Value' i t -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Value' i t
i Value' i t
j) Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1
(STPair l :: Sing a
l m :: Sing b
m, VPair (a :: Value' i l
a, b :: Value' i r
b), VPair (c :: Value' i l
c, d :: Value' i r
d)) ->
case Sing a -> Comparability a
forall (t :: T). Sing t -> Comparability t
checkComparability Sing a
l of
CanBeCompared ->
case Value' i l -> Value' i l -> Integer
forall (t :: T) (i :: [T] -> [T] -> *).
(Comparable t, SingI t) =>
Value' i t -> Value' i t -> Integer
compareOp Value' i l
a Value' i l
Value' i l
c of
0 -> case Sing b -> Comparability b
forall (t :: T). Sing t -> Comparability t
checkComparability Sing b
m of
CanBeCompared -> Value' i r -> Value' i r -> Integer
forall (t :: T) (i :: [T] -> [T] -> *).
(Comparable t, SingI t) =>
Value' i t -> Value' i t -> Integer
compareOp Value' i r
b Value' i r
Value' i r
d
r' :: Integer
r' -> Integer
r'
instance UnaryArithOp Eq' 'TInt where
type UnaryArithRes Eq' 'TInt = 'TBool
evalUnaryArithOp :: proxy Eq'
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Eq' 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Integer
i Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== 0)
instance UnaryArithOp Neq 'TInt where
type UnaryArithRes Neq 'TInt = 'TBool
evalUnaryArithOp :: proxy Neq
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Neq 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Integer
i Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
/= 0)
instance UnaryArithOp Lt 'TInt where
type UnaryArithRes Lt 'TInt = 'TBool
evalUnaryArithOp :: proxy Lt
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Lt 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Integer
i Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< 0)
instance UnaryArithOp Gt 'TInt where
type UnaryArithRes Gt 'TInt = 'TBool
evalUnaryArithOp :: proxy Gt
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Gt 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Integer
i Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
> 0)
instance UnaryArithOp Le 'TInt where
type UnaryArithRes Le 'TInt = 'TBool
evalUnaryArithOp :: proxy Le
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Le 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Integer
i Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
<= 0)
instance UnaryArithOp Ge 'TInt where
type UnaryArithRes Ge 'TInt = 'TBool
evalUnaryArithOp :: proxy Ge
-> Value' instr 'TInt -> Value' instr (UnaryArithRes Ge 'TInt)
evalUnaryArithOp _ (VInt i :: Integer
i) = Bool -> Value' instr 'TBool
forall (instr :: [T] -> [T] -> *). Bool -> Value' instr 'TBool
VBool (Integer
i Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
>= 0)
instance Buildable ArithErrorType where
build :: ArithErrorType -> Builder
build = \case
AddOverflow -> "add overflow"
MulOverflow -> "mul overflow"
SubUnderflow -> "sub overflow"
LslOverflow -> "lsl overflow"
LsrUnderflow -> "lsr underflow"
instance (Show n, Show m) => Buildable (ArithError n m) where
build :: ArithError n m -> Builder
build (MutezArithError errType :: ArithErrorType
errType n :: n
n m :: m
m) = "Mutez "
Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ArithErrorType -> Builder
forall p. Buildable p => p -> Builder
build ArithErrorType
errType Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " with " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> n -> Builder
forall b a. (Show a, IsString b) => a -> b
show n
n Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> m -> Builder
forall b a. (Show a, IsString b) => a -> b
show m
m
build (ShiftArithError errType :: ArithErrorType
errType n :: n
n m :: m
m) =
ArithErrorType -> Builder
forall p. Buildable p => p -> Builder
build ArithErrorType
errType Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> " with " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> n -> Builder
forall b a. (Show a, IsString b) => a -> b
show n
n Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ", " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> m -> Builder
forall b a. (Show a, IsString b) => a -> b
show m
m