{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# HLINT ignore "Eta reduce" #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
module Grisette.Internal.Unified.Class.UnifiedSafeLinearArith
( safeAdd,
safeNeg,
safeSub,
UnifiedSafeLinearArith (..),
)
where
import Control.Monad.Error.Class (MonadError)
import GHC.TypeLits (KnownNat, type (<=))
import Grisette.Internal.Core.Data.Class.SafeLinearArith
( ArithException,
SafeLinearArith,
)
import qualified Grisette.Internal.Core.Data.Class.SafeLinearArith
import Grisette.Internal.SymPrim.BV (IntN, WordN)
import Grisette.Internal.SymPrim.SomeBV
( SomeBVException,
SomeIntN,
SomeSymIntN,
SomeSymWordN,
SomeWordN,
)
import Grisette.Internal.SymPrim.SymBV (SymIntN, SymWordN)
import Grisette.Internal.SymPrim.SymInteger (SymInteger)
import Grisette.Internal.Unified.Class.UnifiedSimpleMergeable
( UnifiedBranching (withBaseBranching),
)
import Grisette.Internal.Unified.EvalModeTag
( EvalModeTag (S),
)
import Grisette.Internal.Unified.Util (withMode)
safeAdd ::
forall mode e a m.
( MonadError e m,
UnifiedSafeLinearArith mode e a m
) =>
a ->
a ->
m a
safeAdd :: forall (mode :: EvalModeTag) e a (m :: * -> *).
(MonadError e m, UnifiedSafeLinearArith mode e a m) =>
a -> a -> m a
safeAdd a
a a
b =
forall (mode :: EvalModeTag) e a (m :: * -> *) r.
UnifiedSafeLinearArith mode e a m =>
(SafeLinearArith e a m => r) -> r
withBaseSafeLinearArith @mode @e @a @m ((SafeLinearArith e a m => m a) -> m a)
-> (SafeLinearArith e a m => m a) -> m a
forall a b. (a -> b) -> a -> b
$
a -> a -> m a
forall e a (m :: * -> *). SafeLinearArith e a m => a -> a -> m a
Grisette.Internal.Core.Data.Class.SafeLinearArith.safeAdd a
a a
b
{-# INLINE safeAdd #-}
safeNeg ::
forall mode e a m.
( MonadError e m,
UnifiedSafeLinearArith mode e a m
) =>
a ->
m a
safeNeg :: forall (mode :: EvalModeTag) e a (m :: * -> *).
(MonadError e m, UnifiedSafeLinearArith mode e a m) =>
a -> m a
safeNeg a
a =
forall (mode :: EvalModeTag) e a (m :: * -> *) r.
UnifiedSafeLinearArith mode e a m =>
(SafeLinearArith e a m => r) -> r
withBaseSafeLinearArith @mode @e @a @m ((SafeLinearArith e a m => m a) -> m a)
-> (SafeLinearArith e a m => m a) -> m a
forall a b. (a -> b) -> a -> b
$
a -> m a
forall e a (m :: * -> *). SafeLinearArith e a m => a -> m a
Grisette.Internal.Core.Data.Class.SafeLinearArith.safeNeg a
a
{-# INLINE safeNeg #-}
safeSub ::
forall mode e a m.
( MonadError e m,
UnifiedSafeLinearArith mode e a m
) =>
a ->
a ->
m a
safeSub :: forall (mode :: EvalModeTag) e a (m :: * -> *).
(MonadError e m, UnifiedSafeLinearArith mode e a m) =>
a -> a -> m a
safeSub a
a a
b =
forall (mode :: EvalModeTag) e a (m :: * -> *) r.
UnifiedSafeLinearArith mode e a m =>
(SafeLinearArith e a m => r) -> r
withBaseSafeLinearArith @mode @e @a @m ((SafeLinearArith e a m => m a) -> m a)
-> (SafeLinearArith e a m => m a) -> m a
forall a b. (a -> b) -> a -> b
$
a -> a -> m a
forall e a (m :: * -> *). SafeLinearArith e a m => a -> a -> m a
Grisette.Internal.Core.Data.Class.SafeLinearArith.safeSub a
a a
b
{-# INLINE safeSub #-}
class UnifiedSafeLinearArith (mode :: EvalModeTag) e a m where
withBaseSafeLinearArith :: ((SafeLinearArith e a m) => r) -> r
instance
{-# INCOHERENT #-}
(UnifiedBranching mode m, SafeLinearArith e a m) =>
UnifiedSafeLinearArith mode e a m
where
withBaseSafeLinearArith :: forall r. (SafeLinearArith e a m => r) -> r
withBaseSafeLinearArith SafeLinearArith e a m => r
r = r
SafeLinearArith e a m => r
r
instance
(MonadError ArithException m, UnifiedBranching mode m) =>
UnifiedSafeLinearArith mode ArithException Integer m
where
withBaseSafeLinearArith :: forall r. (SafeLinearArith ArithException Integer m => r) -> r
withBaseSafeLinearArith SafeLinearArith ArithException Integer m => r
r =
forall (mode :: EvalModeTag) r.
DecideEvalMode mode =>
((mode ~ 'C) => r) -> ((mode ~ 'S) => r) -> r
withMode @mode (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException Integer m => r
r) (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException Integer m => r
r)
instance
(MonadError ArithException m, UnifiedBranching 'S m) =>
UnifiedSafeLinearArith 'S ArithException SymInteger m
where
withBaseSafeLinearArith :: forall r. (SafeLinearArith ArithException SymInteger m => r) -> r
withBaseSafeLinearArith SafeLinearArith ArithException SymInteger m => r
r = forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @'S @m r
If (IsConMode 'S) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException SymInteger m => r
r
instance
(MonadError ArithException m, UnifiedBranching mode m, KnownNat n, 1 <= n) =>
UnifiedSafeLinearArith mode ArithException (IntN n) m
where
withBaseSafeLinearArith :: forall r. (SafeLinearArith ArithException (IntN n) m => r) -> r
withBaseSafeLinearArith SafeLinearArith ArithException (IntN n) m => r
r =
forall (mode :: EvalModeTag) r.
DecideEvalMode mode =>
((mode ~ 'C) => r) -> ((mode ~ 'S) => r) -> r
withMode @mode (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException (IntN n) m => r
r) (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException (IntN n) m => r
r)
instance
(MonadError ArithException m, UnifiedBranching 'S m, KnownNat n, 1 <= n) =>
UnifiedSafeLinearArith 'S ArithException (SymIntN n) m
where
withBaseSafeLinearArith :: forall r. (SafeLinearArith ArithException (SymIntN n) m => r) -> r
withBaseSafeLinearArith SafeLinearArith ArithException (SymIntN n) m => r
r = forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @'S @m r
If (IsConMode 'S) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException (SymIntN n) m => r
r
instance
(MonadError ArithException m, UnifiedBranching mode m, KnownNat n, 1 <= n) =>
UnifiedSafeLinearArith mode ArithException (WordN n) m
where
withBaseSafeLinearArith :: forall r. (SafeLinearArith ArithException (WordN n) m => r) -> r
withBaseSafeLinearArith SafeLinearArith ArithException (WordN n) m => r
r =
forall (mode :: EvalModeTag) r.
DecideEvalMode mode =>
((mode ~ 'C) => r) -> ((mode ~ 'S) => r) -> r
withMode @mode (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException (WordN n) m => r
r) (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException (WordN n) m => r
r)
instance
(MonadError ArithException m, UnifiedBranching 'S m, KnownNat n, 1 <= n) =>
UnifiedSafeLinearArith 'S ArithException (SymWordN n) m
where
withBaseSafeLinearArith :: forall r. (SafeLinearArith ArithException (SymWordN n) m => r) -> r
withBaseSafeLinearArith SafeLinearArith ArithException (SymWordN n) m => r
r = forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @'S @m r
If (IsConMode 'S) (TryMerge m) (SymBranching m) => r
SafeLinearArith ArithException (SymWordN n) m => r
r
instance
( MonadError (Either SomeBVException ArithException) m,
UnifiedBranching mode m
) =>
UnifiedSafeLinearArith
mode
(Either SomeBVException ArithException)
SomeIntN
m
where
withBaseSafeLinearArith :: forall r.
(SafeLinearArith
(Either SomeBVException ArithException) SomeIntN m =>
r)
-> r
withBaseSafeLinearArith SafeLinearArith
(Either SomeBVException ArithException) SomeIntN m =>
r
r =
forall (mode :: EvalModeTag) r.
DecideEvalMode mode =>
((mode ~ 'C) => r) -> ((mode ~ 'S) => r) -> r
withMode @mode (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith
(Either SomeBVException ArithException) SomeIntN m =>
r
r) (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith
(Either SomeBVException ArithException) SomeIntN m =>
r
r)
instance
( MonadError (Either SomeBVException ArithException) m,
UnifiedBranching 'S m
) =>
UnifiedSafeLinearArith
'S
(Either SomeBVException ArithException)
SomeSymIntN
m
where
withBaseSafeLinearArith :: forall r.
(SafeLinearArith
(Either SomeBVException ArithException) SomeSymIntN m =>
r)
-> r
withBaseSafeLinearArith SafeLinearArith
(Either SomeBVException ArithException) SomeSymIntN m =>
r
r = forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @'S @m r
If (IsConMode 'S) (TryMerge m) (SymBranching m) => r
SafeLinearArith
(Either SomeBVException ArithException) SomeSymIntN m =>
r
r
instance
( MonadError (Either SomeBVException ArithException) m,
UnifiedBranching mode m
) =>
UnifiedSafeLinearArith
mode
(Either SomeBVException ArithException)
SomeWordN
m
where
withBaseSafeLinearArith :: forall r.
(SafeLinearArith
(Either SomeBVException ArithException) SomeWordN m =>
r)
-> r
withBaseSafeLinearArith SafeLinearArith
(Either SomeBVException ArithException) SomeWordN m =>
r
r =
forall (mode :: EvalModeTag) r.
DecideEvalMode mode =>
((mode ~ 'C) => r) -> ((mode ~ 'S) => r) -> r
withMode @mode (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith
(Either SomeBVException ArithException) SomeWordN m =>
r
r) (forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @mode @m r
If (IsConMode mode) (TryMerge m) (SymBranching m) => r
SafeLinearArith
(Either SomeBVException ArithException) SomeWordN m =>
r
r)
instance
( MonadError (Either SomeBVException ArithException) m,
UnifiedBranching 'S m
) =>
UnifiedSafeLinearArith
'S
(Either SomeBVException ArithException)
SomeSymWordN
m
where
withBaseSafeLinearArith :: forall r.
(SafeLinearArith
(Either SomeBVException ArithException) SomeSymWordN m =>
r)
-> r
withBaseSafeLinearArith SafeLinearArith
(Either SomeBVException ArithException) SomeSymWordN m =>
r
r = forall (mode :: EvalModeTag) (m :: * -> *) r.
UnifiedBranching mode m =>
(If (IsConMode mode) (TryMerge m) (SymBranching m) => r) -> r
withBaseBranching @'S @m r
If (IsConMode 'S) (TryMerge m) (SymBranching m) => r
SafeLinearArith
(Either SomeBVException ArithException) SomeSymWordN m =>
r
r