From 17bf607fc5b69086550245764fea3c4b851faa5c Mon Sep 17 00:00:00 2001 From: Ari Fordsham Date: Thu, 2 Jun 2022 16:07:32 +0300 Subject: [PATCH 1/2] sample function --- src/Apropos/Gen.hs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Apropos/Gen.hs b/src/Apropos/Gen.hs index 8a4d395..8eacea7 100644 --- a/src/Apropos/Gen.hs +++ b/src/Apropos/Gen.hs @@ -30,6 +30,7 @@ module Apropos.Gen ( linear, linearFrom, singleton, + sample, ) where import Apropos.Gen.Range @@ -44,9 +45,11 @@ 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 (generalize, evalGenT) +import Hedgehog.Internal.Property (PropertyT (PropertyT, unPropertyT), runTestT) import Hedgehog.Range qualified as HRange +import Hedgehog.Internal.Tree (TreeT(runTreeT), NodeT (nodeValue)) +import qualified Hedgehog.Internal.Seed as Seed runGenModifiable :: GenModifiable a -> PropertyT IO (Either GenException a) runGenModifiable g = runExceptT $ runReaderT g (GenModifier id False) @@ -360,3 +363,26 @@ 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) \ No newline at end of file From 2752370c1f74d9d0b4e10ba864edb5471fbde625 Mon Sep 17 00:00:00 2001 From: Ari Fordsham Date: Wed, 8 Jun 2022 15:37:42 +0300 Subject: [PATCH 2/2] Format --- src/Apropos/Gen.hs | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/Apropos/Gen.hs b/src/Apropos/Gen.hs index 8eacea7..296d355 100644 --- a/src/Apropos/Gen.hs +++ b/src/Apropos/Gen.hs @@ -45,11 +45,11 @@ 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, evalGenT) +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 -import Hedgehog.Internal.Tree (TreeT(runTreeT), NodeT (nodeValue)) -import qualified Hedgehog.Internal.Seed as Seed runGenModifiable :: GenModifiable a -> PropertyT IO (Either GenException a) runGenModifiable g = runExceptT $ runReaderT g (GenModifier id False) @@ -366,23 +366,22 @@ 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) \ No newline at end of file + 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)