real-dice-0.1.0.4: test/RealDice/CoinSpec.hs
{-# LANGUAGE GADTs #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# HLINT ignore "Use camelCase" #-}
module RealDice.CoinSpec (doesnt_give_same_result_10_times) where
import Control.Monad.State
import Data.List.Extra (allSame)
import RealDice.Coin (CoinGen, flipCoin, mkCoinGen)
import Test.QuickCheck
data CoinState where
CoinState :: {generator :: CoinGen} -> CoinState
generateFlips :: Int -> [Bool]
generateFlips n =
evalState
(generateFlipsSinglePass 10 [])
(CoinState (mkCoinGen n))
generateFlipsSinglePass :: Int -> [Bool] -> State CoinState [Bool]
generateFlipsSinglePass 0 flips = return flips
generateFlipsSinglePass i flips = do
coinSt <- get
let (randomInteger, gen') = flipCoin (generator coinSt)
put CoinState {generator = gen'}
generateFlipsSinglePass (i - 1) (randomInteger : flips)
doesnt_give_same_result_10_times :: Int -> Property
doesnt_give_same_result_10_times n = n > 0 ==> not (allSame (generateFlips n))