Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions src/Apropos/Gen.hs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ module Apropos.Gen (
linear,
linearFrom,
singleton,
sample,
) where

import Apropos.Gen.Range
Expand All @@ -44,8 +45,10 @@ import Data.Set qualified as Set
import Data.String (fromString)
import Hedgehog qualified as H
import Hedgehog.Gen qualified as HGen
import Hedgehog.Internal.Gen (generalize)
import Hedgehog.Internal.Property (PropertyT (PropertyT))
import Hedgehog.Internal.Gen (evalGenT, generalize)
import Hedgehog.Internal.Property (PropertyT (PropertyT, unPropertyT), runTestT)
import Hedgehog.Internal.Seed qualified as Seed
import Hedgehog.Internal.Tree (NodeT (nodeValue), TreeT (runTreeT))
import Hedgehog.Range qualified as HRange

runGenModifiable :: GenModifiable a -> PropertyT IO (Either GenException a)
Expand Down Expand Up @@ -360,3 +363,25 @@ hRange :: Range -> H.Range Int
hRange (Singleton s) = HRange.singleton s
hRange (Linear lo hi) = HRange.linear lo hi
hRange (LinearFrom mid lo hi) = HRange.linearFrom mid lo hi

sample :: forall a. (Show a) => Gen a -> IO a
sample gen =
let loop :: Int -> IO a
loop n =
if n <= 0
then error "Apropos.Gen.sample: too many discards, could not generate a sample"
else do
seed <- Seed.random
x <-
runTreeT
. evalGenT 30 seed
. fmap fst
. runTestT
. unPropertyT
. runGenModifiable
. forAll
$ gen
case nodeValue x of
Just (Right (Right a)) -> return a
_ -> loop (n - 1)
in loop (100 :: Int)