generic-random: Generic random generators

[ generics, library, mit, testing ] [ Propose Tags ]

For more information


[Skip to Readme]
Versions 0.1.0.0, 0.1.1.0, 0.2.0.0, 0.3.0.0, 0.4.0.0, 0.4.1.0, 0.5.0.0, 1.0.0.0, 1.1.0.0, 1.1.0.1, 1.1.0.2
Change log CHANGELOG.md
Dependencies base (>=4.9 && <4.11), QuickCheck [details]
License MIT
Author Li-yao Xia
Maintainer lysxia@gmail.com
Revised Revision 1 made by lyxia at Mon Jan 1 16:46:46 UTC 2018
Category Generics, Testing
Home page http://github.com/lysxia/generic-random
Source repo head: git clone https://github.com/lysxia/generic-random
Uploaded by lyxia at Mon Jan 1 16:08:11 UTC 2018
Distributions LTSHaskell:1.1.0.2, NixOS:1.1.0.2, Stackage:1.1.0.2, openSUSE:1.1.0.2
Downloads 2996 total (47 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-01-01 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

For package maintainers and hackage trustees


Readme for generic-random-1.1.0.0

[back to package description]

Generic random generators Hackage Build Status

Derive simple random generators for QuickCheck using generics.

Automating the Arbitrary boilerplate also ensures that if a type changes to have more constructors, then the generator fixes itself to generate that new case (with uniform distribution) or causes a compilation error (with an explicit distribution).

A simple (optional) strategy to ensure termination for recursive types: make Test.QuickCheck.Gen's size parameter decrease at every recursive call; when it reaches zero, sample directly from a trivially terminating generator given explicitly (genericArbitraryRec and withBaseCase) or implicitly (genericArbitrary').

Example

{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics (Generic)
import Test.QuickCheck
import Generic.Random

data Tree a = Leaf | Node (Tree a) a (Tree a)
  deriving (Show, Generic)

instance Arbitrary a => Arbitrary (Tree a) where
  arbitrary = genericArbitraryRec uniform `withBaseCase` return Leaf

-- Equivalent to
-- > arbitrary =
-- >   sized $ \n ->
-- >     if n == 0 then
-- >       return Leaf
-- >     else
-- >       oneof
-- >         [ return Leaf
-- >         , resize (n `div` 3) $
-- >             Node <$> arbitrary <*> arbitrary <*> arbitrary
-- >         ]

main = sample (arbitrary :: Gen (Tree ()))