From 99f9d18ee8c8f7dd52152601781415af3ae59bbe Mon Sep 17 00:00:00 2001 From: Matthew Leon Date: Mon, 6 Mar 2017 17:02:20 +0000 Subject: [PATCH] enum gen A handy generator for types that implement the BoundedEnum class. --- bower.json | 4 +++- src/Test/QuickCheck/Gen.purs | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/bower.json b/bower.json index 73ab358..0e8c915 100644 --- a/bower.json +++ b/bower.json @@ -27,6 +27,8 @@ "purescript-lists": "^3.0.0", "purescript-random": "^2.0.0", "purescript-strings": "^2.0.0", - "purescript-transformers": "^2.0.0" + "purescript-transformers": "^2.0.0", + "purescript-enums": "^2.0.1", + "purescript-partial": "^1.2.0" } } diff --git a/src/Test/QuickCheck/Gen.purs b/src/Test/QuickCheck/Gen.purs index d976f85..7beca14 100644 --- a/src/Test/QuickCheck/Gen.purs +++ b/src/Test/QuickCheck/Gen.purs @@ -39,14 +39,17 @@ import Control.Monad.State (State, runState, evalState) import Control.Monad.State.Class (state, modify) import Data.Array ((!!), length) +import Data.Enum (class BoundedEnum, fromEnum, toEnum) import Data.Foldable (fold) import Data.Int (toNumber) import Data.List (List(..), toUnfoldable) -import Data.Maybe (fromMaybe) +import Data.Maybe (fromMaybe, fromJust) import Data.Monoid.Additive (Additive(..)) import Data.Newtype (unwrap) import Data.Tuple (Tuple(..), fst, snd) +import Partial.Unsafe (unsafePartial) + import Math as M import Test.QuickCheck.LCG (Seed, lcgPerturb, lcgN, lcgNext, runSeed, randomSeed) @@ -155,6 +158,15 @@ arrayOf1 g = sized $ \n -> xs <- vectorOf (k - one) g pure $ Tuple x xs +-- | Create a random generator for a finite enumeration. +-- | `toEnum i` must be well-behaved: +-- | It must return a value wrapped in Just for all Ints between +-- | `fromEnum bottom` and `fromEnum top`. +enum :: forall a. BoundedEnum a => Gen a +enum = do + i <- chooseInt (fromEnum (bottom :: a)) (fromEnum (top :: a)) + pure (unsafePartial $ fromJust $ toEnum i) + replicateMRec :: forall m a. MonadRec m => Int -> m a -> m (List a) replicateMRec k _ | k <= 0 = pure Nil replicateMRec k gen = tailRecM go (Tuple Nil k)