grisette-0.1.0.0: src/Grisette/IR/SymPrim/Data/Prim/PartialEval/Integer.hs
-- |
-- Module : Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer
-- Copyright : (c) Sirui Lu 2021-2023
-- License : BSD-3-Clause (see the LICENSE file)
--
-- Maintainer : siruilu@cs.washington.edu
-- Stability : Experimental
-- Portability : GHC only
module Grisette.IR.SymPrim.Data.Prim.PartialEval.Integer
( pevalDivIntegerTerm,
pevalModIntegerTerm,
)
where
import Grisette.IR.SymPrim.Data.Prim.InternedTerm.InternedCtors
import Grisette.IR.SymPrim.Data.Prim.InternedTerm.Term
import Grisette.IR.SymPrim.Data.Prim.PartialEval.Unfold
-- div
pevalDivIntegerTerm :: Term Integer -> Term Integer -> Term Integer
pevalDivIntegerTerm = binaryUnfoldOnce doPevalDivIntegerTerm divIntegerTerm
doPevalDivIntegerTerm :: Term Integer -> Term Integer -> Maybe (Term Integer)
doPevalDivIntegerTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `div` b
doPevalDivIntegerTerm a (ConTerm _ 1) = Just a
doPevalDivIntegerTerm _ _ = Nothing
-- mod
pevalModIntegerTerm :: Term Integer -> Term Integer -> Term Integer
pevalModIntegerTerm = binaryUnfoldOnce doPevalModIntegerTerm modIntegerTerm
doPevalModIntegerTerm :: Term Integer -> Term Integer -> Maybe (Term Integer)
doPevalModIntegerTerm (ConTerm _ a) (ConTerm _ b) | b /= 0 = Just $ conTerm $ a `mod` b
doPevalModIntegerTerm _ (ConTerm _ 1) = Just $ conTerm 0
doPevalModIntegerTerm _ (ConTerm _ (-1)) = Just $ conTerm 0
doPevalModIntegerTerm _ _ = Nothing