-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Generic implementation for QuickCheck's Arbitrary -- -- Generic implementations of methods of the Arbitrary class from -- the QuickCheck library. The approach taken here can lead to diverging -- instances for recursive types but is safe for non-recursive ones and -- guarantees flat distribution for constructors of sum-types. @package generic-arbitrary @version 0.1.0 -- | Generic implementation of the arbitrary method. Example usage: -- --
-- data Foo = Foo
-- { _fooX :: X
-- , _fooY :: Y
-- } deriving (Generic)
--
-- instance Arbitrary Foo where
-- arbitrary = genericArbitrary
-- shrink = genericShrink
--
--
-- The generated arbitrary method is equivalent to
--
-- Foo $ arbitrary * arbitrary.
module Test.QuickCheck.Arbitrary.Generic
-- | Random generation and shrinking of values.
class Arbitrary a
-- | A generator for values of the given type.
arbitrary :: Arbitrary a => Gen a
-- | Produces a (possibly) empty list of all the possible immediate shrinks
-- of the given value. The default implementation returns the empty list,
-- so will not try to shrink the value.
--
-- Most implementations of shrink should try at least three
-- things:
--
-- -- data Tree a = Nil | Branch a (Tree a) (Tree a) ---- -- We can then define shrink as follows: -- --
-- shrink Nil = [] -- shrink (Branch x l r) = -- -- shrink Branch to Nil -- [Nil] ++ -- -- shrink to subterms -- [l, r] ++ -- -- recursively shrink subterms -- [Branch x' l' r' | (x', l', r') <- shrink (x, l, r)] ---- -- There are a couple of subtleties here: -- --
-- shrink x = shrinkToNil x ++ genericShrink x -- where -- shrinkToNil Nil = [] -- shrinkToNil (Branch _ l r) = [Nil] ---- -- genericShrink is a combination of subterms, which -- shrinks a term to any of its subterms, and recursivelyShrink, -- which shrinks all subterms of a term. These may be useful if you need -- a bit more control over shrinking than genericShrink gives you. -- -- A final gotcha: we cannot define shrink as simply -- shrink x = Nil:genericShrink x as this shrinks -- Nil to Nil, and shrinking will go into an infinite -- loop. -- -- If all this leaves you bewildered, you might try shrink = -- genericShrink to begin with, after deriving -- Generic for your type. However, if your data type has any -- special invariants, you will need to check that genericShrink -- can't break those invariants. shrink :: Arbitrary a => a -> [a] genericArbitrary :: (Generic a, GArbitrary ga, ga ~ Rep a) => Gen a -- | Shrink a term to any of its immediate subterms, and also recursively -- shrink all subterms. genericShrink :: (Generic a, RecursivelyShrink (Rep a), GSubterms (Rep a) a) => a -> [a] instance Test.QuickCheck.Arbitrary.Generic.GArbitrary GHC.Generics.U1 instance Test.QuickCheck.Arbitrary.Arbitrary c => Test.QuickCheck.Arbitrary.Generic.GArbitrary (GHC.Generics.K1 i c) instance Test.QuickCheck.Arbitrary.Generic.GArbitrary f => Test.QuickCheck.Arbitrary.Generic.GArbitrary (GHC.Generics.M1 i c f) instance (Test.QuickCheck.Arbitrary.Generic.GArbitrary a, Test.QuickCheck.Arbitrary.Generic.GArbitrary b) => Test.QuickCheck.Arbitrary.Generic.GArbitrary (a GHC.Generics.:*: b) instance (Test.QuickCheck.Arbitrary.Generic.GArbitrary a, Test.QuickCheck.Arbitrary.Generic.GArbitrary b, GHC.TypeLits.KnownNat (Test.QuickCheck.Arbitrary.Generic.SumLen a), GHC.TypeLits.KnownNat (Test.QuickCheck.Arbitrary.Generic.SumLen b)) => Test.QuickCheck.Arbitrary.Generic.GArbitrary (a GHC.Generics.:+: b)