-- | Helpers to generate random functions.
module Quickpull.Function where

import Test.QuickCheck
import Test.QuickCheck.Gen.Unsafe

-- | Generate a random function.  This is simply a duplicate of what's
-- in the QuickCheck 'Arbitrary' instance for functions; having it
-- here saves you from having to define 'Arbitrary' and 'CoArbitrary'
-- instances for your types (which can require either orphan instances
-- or a lot of annoying wrapping and unwrapping.)
function
  :: (a -> Gen b -> Gen b)
  -> Gen b
  -> Gen (a -> b)
function perturb gen = promote (`perturb` gen)