generic-random: Generic random generators

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

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

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 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, 1.2.0.0, 1.3.0.0, 1.3.0.1, 1.4.0.0, 1.5.0.0, 1.5.0.1
Change log CHANGELOG.md
Dependencies base (>=4.7 && <4.16), QuickCheck [details]
License MIT
Author Li-yao Xia
Maintainer lysxia@gmail.com
Revised Revision 2 made by sjakobi at 2021-11-11T14:29:09Z
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 2018-05-31T14:10:39Z
Distributions Arch:1.5.0.1, Debian:1.3.0.1, LTSHaskell:1.5.0.1, NixOS:1.5.0.1, Stackage:1.5.0.1
Reverse Dependencies 8 direct, 2 indirect [details]
Downloads 27780 total (129 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2018-05-31 [all 1 reports]

Readme for generic-random-1.2.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 ()))