{-# LANGUAGE TypeApplications #-}
module Gens (module Gens) where
import Control.Monad (unless, void)
import Control.Monad.IO.Class (MonadIO)
import Data.List (nub)
import Data.Snowchecked
import Data.WideWord.Word256
import Data.Word
import Hedgehog
import qualified Hedgehog.Gen as Gen
import Hedgehog.Main (defaultMain)
import qualified Hedgehog.Range as Range
genWord8 :: (MonadGen m) => m Word8
genWord8 = Gen.word8 $ Range.linear (minBound @Word8) (maxBound @Word8)
genWord256 :: (MonadGen m) => m Word256
genWord256 = Gen.integral $ Range.linear (minBound @Word256) (maxBound @Word256)
genConfig :: (MonadGen m) => m SnowcheckedConfig
genConfig = SnowcheckedConfig
<$> Gen.integral (Range.linear 2 (maxBound @Word8))
<*> Gen.integral (Range.linear 2 (maxBound @Word8))
<*> Gen.integral (Range.linear 2 (maxBound @Word8))
<*> Gen.integral (Range.linear 2 (maxBound @Word8))
forAllFlake :: (MonadIO m) => PropertyT m Flake
forAllFlake = forAll genConfig >>= forAllFlake'
forAllFlake' :: (MonadIO m) => SnowcheckedConfig -> PropertyT m Flake
forAllFlake' cfg = do
nodeId <- forAll genWord256
newSnowcheckedGen cfg nodeId >>= nextFlake