module Hedgehog.Golden.Sample
  ( genSamples
  ) where

import           Prelude

import           Data.Functor.Identity (runIdentity)
import           Data.Sequence (Seq)
import           Hedgehog
import qualified Hedgehog.Internal.Gen as Gen
import qualified Hedgehog.Internal.Tree as Tree
import qualified Hedgehog.Range as Range
import           Control.Monad.Trans.Maybe (MaybeT(..))

-- | Generate a fixed Seq of @a@ from the given generator
genSamples :: Seed -> Gen a -> Seq a
genSamples seed gen =
  let
    loop n = \case
      Just tree -> tree
      Nothing ->
        if n < 0 then
          error "Too many discards - abandoned generating samples"
        else
          loop (n - 1)
            . fmap Tree.nodeValue
            . runIdentity
            . runMaybeT
            . Tree.runTree
            . Gen.runGenT 0 seed $ Gen.seq (Range.singleton 10) gen
  in
    loop (100 :: Int) Nothing