module Test.Falsify.Internal.SampleTree (
SampleTree(..)
, Sample(..)
, pattern Inf
, sampleValue
, next
, left
, right
, fromPRNG
, fromSeed
, minimal
, constant
, map
, mod
) where
import Prelude hiding (map, mod)
import qualified Prelude
import Data.Word
import Optics.Core (Lens')
import System.Random.SplitMix
import qualified Optics.Core as Optics
data SampleTree =
SampleTree Sample SampleTree SampleTree
| Minimal
deriving (Int -> SampleTree -> ShowS
[SampleTree] -> ShowS
SampleTree -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SampleTree] -> ShowS
$cshowList :: [SampleTree] -> ShowS
show :: SampleTree -> String
$cshow :: SampleTree -> String
showsPrec :: Int -> SampleTree -> ShowS
$cshowsPrec :: Int -> SampleTree -> ShowS
Show)
data Sample =
NotShrunk Word64
| Shrunk Word64
deriving (Int -> Sample -> ShowS
[Sample] -> ShowS
Sample -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Sample] -> ShowS
$cshowList :: [Sample] -> ShowS
show :: Sample -> String
$cshow :: Sample -> String
showsPrec :: Int -> Sample -> ShowS
$cshowsPrec :: Int -> Sample -> ShowS
Show, Sample -> Sample -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Sample -> Sample -> Bool
$c/= :: Sample -> Sample -> Bool
== :: Sample -> Sample -> Bool
$c== :: Sample -> Sample -> Bool
Eq, Eq Sample
Sample -> Sample -> Bool
Sample -> Sample -> Ordering
Sample -> Sample -> Sample
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 :: Sample -> Sample -> Sample
$cmin :: Sample -> Sample -> Sample
max :: Sample -> Sample -> Sample
$cmax :: Sample -> Sample -> Sample
>= :: Sample -> Sample -> Bool
$c>= :: Sample -> Sample -> Bool
> :: Sample -> Sample -> Bool
$c> :: Sample -> Sample -> Bool
<= :: Sample -> Sample -> Bool
$c<= :: Sample -> Sample -> Bool
< :: Sample -> Sample -> Bool
$c< :: Sample -> Sample -> Bool
compare :: Sample -> Sample -> Ordering
$ccompare :: Sample -> Sample -> Ordering
Ord)
sampleValue :: Sample -> Word64
sampleValue :: Sample -> Word64
sampleValue (NotShrunk Word64
s) = Word64
s
sampleValue (Shrunk Word64
s) = Word64
s
view :: SampleTree -> (Sample, SampleTree, SampleTree)
view :: SampleTree -> (Sample, SampleTree, SampleTree)
view SampleTree
Minimal = (Word64 -> Sample
Shrunk Word64
0, SampleTree
Minimal, SampleTree
Minimal)
view (SampleTree Sample
s SampleTree
l SampleTree
r) = (Sample
s, SampleTree
l, SampleTree
r)
pattern Inf :: Sample -> SampleTree -> SampleTree -> SampleTree
pattern $mInf :: forall {r}.
SampleTree
-> (Sample -> SampleTree -> SampleTree -> r) -> ((# #) -> r) -> r
Inf s l r <- (view -> (s, l, r))
{-# COMPLETE Inf #-}
next :: Lens' SampleTree Sample
next :: Lens' SampleTree Sample
next = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Optics.lens SampleTree -> Sample
getter SampleTree -> Sample -> SampleTree
setter
where
getter :: SampleTree -> Sample
getter :: SampleTree -> Sample
getter (Inf Sample
s SampleTree
_ SampleTree
_) = Sample
s
setter :: SampleTree -> Sample -> SampleTree
setter :: SampleTree -> Sample -> SampleTree
setter SampleTree
Minimal Sample
_ = SampleTree
Minimal
setter (SampleTree Sample
_ SampleTree
l SampleTree
r) Sample
s = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree Sample
s SampleTree
l SampleTree
r
left :: Lens' SampleTree SampleTree
left :: Lens' SampleTree SampleTree
left = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Optics.lens SampleTree -> SampleTree
getter SampleTree -> SampleTree -> SampleTree
setter
where
getter :: SampleTree -> SampleTree
getter :: SampleTree -> SampleTree
getter (Inf Sample
_ SampleTree
l SampleTree
_) = SampleTree
l
setter :: SampleTree -> SampleTree -> SampleTree
setter :: SampleTree -> SampleTree -> SampleTree
setter SampleTree
Minimal SampleTree
_ = SampleTree
Minimal
setter (SampleTree Sample
s SampleTree
_ SampleTree
r) SampleTree
l = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree Sample
s SampleTree
l SampleTree
r
right :: Lens' SampleTree SampleTree
right :: Lens' SampleTree SampleTree
right = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Optics.lens SampleTree -> SampleTree
getter SampleTree -> SampleTree -> SampleTree
setter
where
getter :: SampleTree -> SampleTree
getter :: SampleTree -> SampleTree
getter (Inf Sample
_ SampleTree
_ SampleTree
r) = SampleTree
r
setter :: SampleTree -> SampleTree -> SampleTree
setter :: SampleTree -> SampleTree -> SampleTree
setter SampleTree
Minimal SampleTree
_ = SampleTree
Minimal
setter (SampleTree Sample
s SampleTree
l SampleTree
_) SampleTree
r = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree Sample
s SampleTree
l SampleTree
r
fromPRNG :: SMGen -> SampleTree
fromPRNG :: SMGen -> SampleTree
fromPRNG = SMGen -> SampleTree
go
where
go :: SMGen -> SampleTree
go :: SMGen -> SampleTree
go SMGen
g =
let (Word64
n, SMGen
_) = SMGen -> (Word64, SMGen)
nextWord64 SMGen
g
(SMGen
l, SMGen
r) = SMGen -> (SMGen, SMGen)
splitSMGen SMGen
g
in Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree (Word64 -> Sample
NotShrunk Word64
n) (SMGen -> SampleTree
go SMGen
l) (SMGen -> SampleTree
go SMGen
r)
fromSeed :: Word64 -> SampleTree
fromSeed :: Word64 -> SampleTree
fromSeed = SMGen -> SampleTree
fromPRNG forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word64 -> SMGen
mkSMGen
minimal :: SampleTree
minimal :: SampleTree
minimal = SampleTree
Minimal
constant :: Word64 -> SampleTree
constant :: Word64 -> SampleTree
constant Word64
s = SampleTree
go
where
go :: SampleTree
go :: SampleTree
go = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree (Word64 -> Sample
NotShrunk Word64
s) SampleTree
go SampleTree
go
map :: (Word64 -> Word64) -> SampleTree -> SampleTree
map :: (Word64 -> Word64) -> SampleTree -> SampleTree
map Word64 -> Word64
f = SampleTree -> SampleTree
go
where
go :: SampleTree -> SampleTree
go :: SampleTree -> SampleTree
go (SampleTree Sample
s SampleTree
l SampleTree
r) = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree (Sample -> Sample
mapSample Sample
s) (SampleTree -> SampleTree
go SampleTree
l) (SampleTree -> SampleTree
go SampleTree
r)
go SampleTree
Minimal = SampleTree
Minimal
mapSample :: Sample -> Sample
mapSample :: Sample -> Sample
mapSample (NotShrunk Word64
s) = Word64 -> Sample
NotShrunk (Word64 -> Word64
f Word64
s)
mapSample (Shrunk Word64
s) = Word64 -> Sample
Shrunk (Word64 -> Word64
f Word64
s)
mod :: Word64 -> SampleTree -> SampleTree
mod :: Word64 -> SampleTree -> SampleTree
mod Word64
m = (Word64 -> Word64) -> SampleTree -> SampleTree
map (\Word64
s -> Word64
s forall a. Integral a => a -> a -> a
`Prelude.mod` Word64
m)