{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wall -Werror -fno-warn-orphans #-}
module Data.SBV.Maybe (
sJust, sNothing, liftMaybe, SMaybe, sMaybe, sMaybe_, sMaybes
, maybe
, map, map2
, isNothing, isJust, fromMaybe, fromJust
) where
import Prelude hiding (maybe, map)
import qualified Prelude
import Data.SBV.Client
import Data.SBV.Core.Data
import Data.SBV.Core.Model (ite, OrdSymbolic(..))
#ifdef DOCTEST
#endif
mkSymbolic [''Maybe]
sMaybe :: SymVal a => String -> Symbolic (SMaybe a)
sMaybe :: forall a. SymVal a => String -> Symbolic (SMaybe a)
sMaybe = String -> SymbolicT IO (SBV (Maybe a))
forall a (m :: * -> *).
(SymVal a, MonadSymbolic m) =>
String -> m (SBV a)
forall (m :: * -> *).
MonadSymbolic m =>
String -> m (SBV (Maybe a))
free
sMaybe_ :: SymVal a => Symbolic (SMaybe a)
sMaybe_ :: forall a. SymVal a => Symbolic (SMaybe a)
sMaybe_ = SymbolicT IO (SBV (Maybe a))
forall a (m :: * -> *). (SymVal a, MonadSymbolic m) => m (SBV a)
forall (m :: * -> *). MonadSymbolic m => m (SBV (Maybe a))
free_
sMaybes :: SymVal a => [String] -> Symbolic [SMaybe a]
sMaybes :: forall a. SymVal a => [String] -> Symbolic [SMaybe a]
sMaybes = [String] -> SymbolicT IO [SBV (Maybe a)]
forall a (m :: * -> *).
(SymVal a, MonadSymbolic m) =>
[String] -> m [SBV a]
forall (m :: * -> *).
MonadSymbolic m =>
[String] -> m [SBV (Maybe a)]
symbolics
fromMaybe :: SymVal a => SBV a -> SMaybe a -> SBV a
fromMaybe :: forall a. SymVal a => SBV a -> SMaybe a -> SBV a
fromMaybe SBV a
def = SBV a -> (SBV a -> SBV a) -> SMaybe a -> SBV a
forall a b.
(SymVal a, SymVal b) =>
SBV b -> (SBV a -> SBV b) -> SMaybe a -> SBV b
maybe SBV a
def SBV a -> SBV a
forall a. a -> a
id
fromJust :: forall a. SymVal a => SMaybe a -> SBV a
fromJust :: forall a. SymVal a => SBV (Maybe a) -> SBV a
fromJust = SBV (Maybe a) -> SBV a
forall a. SymVal a => SBV (Maybe a) -> SBV a
getJust_1
liftMaybe :: SymVal a => Maybe (SBV a) -> SMaybe a
liftMaybe :: forall a. SymVal a => Maybe (SBV a) -> SMaybe a
liftMaybe = SMaybe a -> (SBV a -> SMaybe a) -> Maybe (SBV a) -> SMaybe a
forall b a. b -> (a -> b) -> Maybe a -> b
Prelude.maybe (Maybe a -> SMaybe a
forall a. SymVal a => a -> SBV a
literal Maybe a
forall a. Maybe a
Nothing) SBV a -> SMaybe a
forall a. SymVal a => SBV a -> SBV (Maybe a)
sJust
map :: forall a b. (SymVal a, SymVal b)
=> (SBV a -> SBV b)
-> SMaybe a
-> SMaybe b
map :: forall a b.
(SymVal a, SymVal b) =>
(SBV a -> SBV b) -> SMaybe a -> SMaybe b
map SBV a -> SBV b
f = SBV (Maybe b)
-> (SBV a -> SBV (Maybe b)) -> SMaybe a -> SBV (Maybe b)
forall a b.
(SymVal a, SymVal b) =>
SBV b -> (SBV a -> SBV b) -> SMaybe a -> SBV b
maybe SBV (Maybe b)
forall a. SymVal a => SBV (Maybe a)
sNothing (SBV b -> SBV (Maybe b)
forall a. SymVal a => SBV a -> SBV (Maybe a)
sJust (SBV b -> SBV (Maybe b))
-> (SBV a -> SBV b) -> SBV a -> SBV (Maybe b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SBV a -> SBV b
f)
map2 :: forall a b c. (SymVal a, SymVal b, SymVal c) => (SBV a -> SBV b -> SBV c) -> SMaybe a -> SMaybe b -> SMaybe c
map2 :: forall a b c.
(SymVal a, SymVal b, SymVal c) =>
(SBV a -> SBV b -> SBV c) -> SMaybe a -> SMaybe b -> SMaybe c
map2 SBV a -> SBV b -> SBV c
op SMaybe a
mx SMaybe b
my = SBool -> SMaybe c -> SMaybe c -> SMaybe c
forall a. Mergeable a => SBool -> a -> a -> a
ite (SMaybe a -> SBool
forall a. SymVal a => SBV (Maybe a) -> SBool
isJust SMaybe a
mx SBool -> SBool -> SBool
.&& SMaybe b -> SBool
forall a. SymVal a => SBV (Maybe a) -> SBool
isJust SMaybe b
my)
(SBV c -> SMaybe c
forall a. SymVal a => SBV a -> SBV (Maybe a)
sJust (SMaybe a -> SBV a
forall a. SymVal a => SBV (Maybe a) -> SBV a
fromJust SMaybe a
mx SBV a -> SBV b -> SBV c
`op` SMaybe b -> SBV b
forall a. SymVal a => SBV (Maybe a) -> SBV a
fromJust SMaybe b
my))
SMaybe c
forall a. SymVal a => SBV (Maybe a)
sNothing
maybe :: forall a b. (SymVal a, SymVal b)
=> SBV b
-> (SBV a -> SBV b)
-> SMaybe a
-> SBV b
maybe :: forall a b.
(SymVal a, SymVal b) =>
SBV b -> (SBV a -> SBV b) -> SMaybe a -> SBV b
maybe SBV b
brNothing SBV a -> SBV b
brJust SMaybe a
ma = SBool -> SBV b -> SBV b -> SBV b
forall a. Mergeable a => SBool -> a -> a -> a
ite (SMaybe a -> SBool
forall a. SymVal a => SBV (Maybe a) -> SBool
isNothing SMaybe a
ma) SBV b
brNothing (SBV a -> SBV b
brJust (SMaybe a -> SBV a
forall a. SymVal a => SBV (Maybe a) -> SBV a
fromJust SMaybe a
ma))
instance (Ord a, SymVal a, Num a, Num (SBV a)) => Num (SBV (Maybe a)) where
+ :: SBV (Maybe a) -> SBV (Maybe a) -> SBV (Maybe a)
(+) = (SBV a -> SBV a -> SBV a)
-> SBV (Maybe a) -> SBV (Maybe a) -> SBV (Maybe a)
forall a b c.
(SymVal a, SymVal b, SymVal c) =>
(SBV a -> SBV b -> SBV c) -> SMaybe a -> SMaybe b -> SMaybe c
map2 SBV a -> SBV a -> SBV a
forall a. Num a => a -> a -> a
(+)
(-) = (SBV a -> SBV a -> SBV a)
-> SBV (Maybe a) -> SBV (Maybe a) -> SBV (Maybe a)
forall a b c.
(SymVal a, SymVal b, SymVal c) =>
(SBV a -> SBV b -> SBV c) -> SMaybe a -> SMaybe b -> SMaybe c
map2 (-)
* :: SBV (Maybe a) -> SBV (Maybe a) -> SBV (Maybe a)
(*) = (SBV a -> SBV a -> SBV a)
-> SBV (Maybe a) -> SBV (Maybe a) -> SBV (Maybe a)
forall a b c.
(SymVal a, SymVal b, SymVal c) =>
(SBV a -> SBV b -> SBV c) -> SMaybe a -> SMaybe b -> SMaybe c
map2 SBV a -> SBV a -> SBV a
forall a. Num a => a -> a -> a
(*)
abs :: SBV (Maybe a) -> SBV (Maybe a)
abs = (SBV a -> SBV a) -> SBV (Maybe a) -> SBV (Maybe a)
forall a b.
(SymVal a, SymVal b) =>
(SBV a -> SBV b) -> SMaybe a -> SMaybe b
map SBV a -> SBV a
forall a. Num a => a -> a
abs
signum :: SBV (Maybe a) -> SBV (Maybe a)
signum = (SBV a -> SBV a) -> SBV (Maybe a) -> SBV (Maybe a)
forall a b.
(SymVal a, SymVal b) =>
(SBV a -> SBV b) -> SMaybe a -> SMaybe b
map SBV a -> SBV a
forall a. Num a => a -> a
signum
fromInteger :: Integer -> SBV (Maybe a)
fromInteger = SBV a -> SBV (Maybe a)
forall a. SymVal a => SBV a -> SBV (Maybe a)
sJust (SBV a -> SBV (Maybe a))
-> (Integer -> SBV a) -> Integer -> SBV (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> SBV a
forall a. Num a => Integer -> a
fromInteger
instance (OrdSymbolic (SBV a), SymVal a) => OrdSymbolic (SBV (Maybe a)) where
SBV (Maybe a)
ma .< :: SBV (Maybe a) -> SBV (Maybe a) -> SBool
.< SBV (Maybe a)
mb = SBool -> (SBV a -> SBool) -> SBV (Maybe a) -> SBool
forall a b.
(SymVal a, SymVal b) =>
SBV b -> (SBV a -> SBV b) -> SMaybe a -> SBV b
maybe SBool
sFalse (\SBV a
b -> SBool -> (SBV a -> SBool) -> SBV (Maybe a) -> SBool
forall a b.
(SymVal a, SymVal b) =>
SBV b -> (SBV a -> SBV b) -> SMaybe a -> SBV b
maybe SBool
sTrue (SBV a -> SBV a -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.< SBV a
b) SBV (Maybe a)
ma) SBV (Maybe a)
mb