{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Trustworthy #-}
module Grisette.Internal.Core.Data.Class.Error
(
TransformError (..),
symAssertWith,
symAssertTransformableError,
symThrowTransformableError,
symAssert,
symAssume,
)
where
import Control.Exception (ArithException, ArrayException)
import Control.Monad.Except (MonadError (throwError))
import Grisette.Internal.Core.Control.Exception
( AssertionError (AssertionError),
VerificationConditions (AssertionViolation, AssumptionViolation),
)
import Grisette.Internal.Core.Control.Monad.Class.Union (MonadUnion)
import Grisette.Internal.Core.Data.Class.Mergeable (Mergeable)
import Grisette.Internal.Core.Data.Class.SimpleMergeable (mrgIf)
import Grisette.Internal.Core.Data.Class.TryMerge (tryMerge)
import Grisette.Internal.SymPrim.SymBool (SymBool)
class TransformError from to where
transformError :: from -> to
instance {-# OVERLAPPABLE #-} TransformError a a where
transformError :: a -> a
transformError = a -> a
forall a. a -> a
id
{-# INLINE transformError #-}
instance {-# OVERLAPS #-} TransformError a () where
transformError :: a -> ()
transformError a
_ = ()
{-# INLINE transformError #-}
instance {-# OVERLAPPING #-} TransformError () () where
transformError :: () -> ()
transformError ()
_ = ()
{-# INLINE transformError #-}
symThrowTransformableError ::
( Mergeable to,
Mergeable a,
TransformError from to,
MonadError to erm,
MonadUnion erm
) =>
from ->
erm a
symThrowTransformableError :: forall to a from (erm :: * -> *).
(Mergeable to, Mergeable a, TransformError from to,
MonadError to erm, MonadUnion erm) =>
from -> erm a
symThrowTransformableError = erm a -> erm a
forall (m :: * -> *) a. (TryMerge m, Mergeable a) => m a -> m a
tryMerge (erm a -> erm a) -> (from -> erm a) -> from -> erm a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. to -> erm a
forall a. to -> erm a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (to -> erm a) -> (from -> to) -> from -> erm a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. from -> to
forall from to. TransformError from to => from -> to
transformError
{-# INLINE symThrowTransformableError #-}
symAssertTransformableError ::
( Mergeable to,
TransformError from to,
MonadError to erm,
MonadUnion erm
) =>
from ->
SymBool ->
erm ()
symAssertTransformableError :: forall to from (erm :: * -> *).
(Mergeable to, TransformError from to, MonadError to erm,
MonadUnion erm) =>
from -> SymBool -> erm ()
symAssertTransformableError from
err SymBool
cond = SymBool -> erm () -> erm () -> erm ()
forall (u :: * -> *) a.
(SymBranching u, Mergeable a) =>
SymBool -> u a -> u a -> u a
mrgIf SymBool
cond (() -> erm ()
forall a. a -> erm a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) (from -> erm ()
forall to a from (erm :: * -> *).
(Mergeable to, Mergeable a, TransformError from to,
MonadError to erm, MonadUnion erm) =>
from -> erm a
symThrowTransformableError from
err)
{-# INLINE symAssertTransformableError #-}
symAssertWith ::
( Mergeable e,
MonadError e erm,
MonadUnion erm
) =>
e ->
SymBool ->
erm ()
symAssertWith :: forall e (erm :: * -> *).
(Mergeable e, MonadError e erm, MonadUnion erm) =>
e -> SymBool -> erm ()
symAssertWith e
err SymBool
cond = SymBool -> erm () -> erm () -> erm ()
forall (u :: * -> *) a.
(SymBranching u, Mergeable a) =>
SymBool -> u a -> u a -> u a
mrgIf SymBool
cond (() -> erm ()
forall a. a -> erm a
forall (m :: * -> *) a. Monad m => a -> m a
return ()) (e -> erm ()
forall a. e -> erm a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError e
err)
{-# INLINE symAssertWith #-}
instance TransformError VerificationConditions VerificationConditions where
transformError :: VerificationConditions -> VerificationConditions
transformError = VerificationConditions -> VerificationConditions
forall a. a -> a
id
instance TransformError AssertionError VerificationConditions where
transformError :: AssertionError -> VerificationConditions
transformError AssertionError
_ = VerificationConditions
AssertionViolation
instance TransformError ArithException AssertionError where
transformError :: ArithException -> AssertionError
transformError ArithException
_ = AssertionError
AssertionError
instance TransformError ArrayException AssertionError where
transformError :: ArrayException -> AssertionError
transformError ArrayException
_ = AssertionError
AssertionError
instance TransformError AssertionError AssertionError where
transformError :: AssertionError -> AssertionError
transformError = AssertionError -> AssertionError
forall a. a -> a
id
symAssert ::
(TransformError AssertionError to, Mergeable to, MonadError to erm, MonadUnion erm) =>
SymBool ->
erm ()
symAssert :: forall to (erm :: * -> *).
(TransformError AssertionError to, Mergeable to, MonadError to erm,
MonadUnion erm) =>
SymBool -> erm ()
symAssert = AssertionError -> SymBool -> erm ()
forall to from (erm :: * -> *).
(Mergeable to, TransformError from to, MonadError to erm,
MonadUnion erm) =>
from -> SymBool -> erm ()
symAssertTransformableError AssertionError
AssertionError
symAssume ::
(TransformError VerificationConditions to, Mergeable to, MonadError to erm, MonadUnion erm) =>
SymBool ->
erm ()
symAssume :: forall to (erm :: * -> *).
(TransformError VerificationConditions to, Mergeable to,
MonadError to erm, MonadUnion erm) =>
SymBool -> erm ()
symAssume = VerificationConditions -> SymBool -> erm ()
forall to from (erm :: * -> *).
(Mergeable to, TransformError from to, MonadError to erm,
MonadUnion erm) =>
from -> SymBool -> erm ()
symAssertTransformableError VerificationConditions
AssumptionViolation