mirror of
https://github.com/Lysxia/generic-random.git
synced 2024-11-09 12:01:27 +03:00
Generic random generators
examples | ||
src/Generic/Random | ||
test | ||
.travis.yml | ||
CHANGELOG.md | ||
generic-random.cabal | ||
LICENSE | ||
README.md | ||
Setup.hs |
Generic random generators
Say goodbye to Constructor <$> arbitrary <*> arbitrary <*> arbitrary
-boilerplate.
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics ( Generic )
import Test.QuickCheck
import Generic.Random.Generic
data Tree a = Leaf | Node (Tree a) a (Tree a)
deriving (Show, Generic)
instance Arbitrary a => Arbitrary (Tree a) where
arbitrary = genericArbitrary' Z uniform
-- Equivalent to
-- > arbitrary =
-- > sized $ \n ->
-- > if n == 0 then
-- > return Leaf
-- > else
-- > oneof
-- > [ return Leaf
-- > , Node <$> arbitrary <*> arbitrary <*> arbitrary
-- > ]
main = sample (arbitrary :: Gen (Tree ()))
- User-specified distribution of constructors, with a compile-time check that weights have been specified for all constructors.
- A simple (optional) strategy to ensure termination:
Test.QuickCheck.Gen
's size parameter decreases at every recursivegenericArbitrary'
call; when it reaches zero, sample directly from a finite set of finite values.