-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Testing utilities for the validity library
--   
--   Note: There are companion instance packages for this library:
--   
--   <ul>
--   <li><a>genvalidity-aeson</a></li>
--   <li><a>genvalidity-bytestring</a></li>
--   <li><a>genvalidity-containers</a></li>
--   <li><a>genvalidity-path</a></li>
--   <li><a>genvalidity-scientific</a></li>
--   <li><a>genvalidity-text</a></li>
--   <li><a>genvalidity-time</a></li>
--   <li><a>genvalidity-unordered-containers</a></li>
--   <li><a>genvalidity-uuid</a></li>
--   <li><a>genvalidity-vector</a></li>
--   </ul>
@package genvalidity
@version 0.5.1.0


-- | <tt>GenValidity</tt> exists to make tests involving <tt>Validity</tt>
--   types easier and speed up the generation of data for them.
--   
--   Let's use the example from <tt>Data.Validity</tt> again: A datatype
--   that represents primes. To implement tests for this datatype, we would
--   have to be able to generate both primes and non-primes. We could do
--   this with <tt>(Prime <a>$</a> arbitrary) <a>suchThat</a> isValid</tt>
--   but this is tedious and inefficient.
--   
--   The <tt>GenValid</tt> type class allows you to specify how to
--   (efficiently) generate valid data of the given type to allow for
--   easier and quicker testing. Just instantiating <tt>GenUnchecked</tt>
--   already gives you access to a default instance of <tt>GenValid</tt>
--   and <tt>GenInvalid</tt> but writing custom implementations of these
--   functions may speed up the generation of data.
--   
--   For example, to generate primes, we don't have to consider even
--   numbers other than 2. A more efficient implementation could then look
--   as follows:
--   
--   <pre>
--   instance GenUnchecked Prime where
--       genUnchecked = Prime &lt;$&gt; arbitrary
--   </pre>
--   
--   <pre>
--   instance GenValid Prime where
--       genValid = Prime &lt;$&gt;
--          (oneof
--            [ pure 2
--            , ((\y -&gt; 2 * abs y + 1) &lt;$&gt; arbitrary) `suchThat` isPrime)
--            ])
--   </pre>
--   
--   Typical examples of tests involving validity could look as follows:
--   
--   <pre>
--   it "succeeds when given valid input" $ do
--       forAllValid $ \input -&gt;
--           myFunction input `shouldSatisfy` isRight
--   </pre>
--   
--   <pre>
--   it "produces valid output when it succeeds" $ do
--       forAllUnchecked $ \input -&gt;
--           case myFunction input of
--               Nothing -&gt; return () -- Can happen
--               Just output -&gt; output `shouldSatisfy` isValid
--   </pre>
module Data.GenValidity
class GUncheckedSubtermsIncl f a
gUncheckedSubtermsIncl :: GUncheckedSubtermsIncl f a => f a -> [a]
class GUncheckedSubterms f a
gUncheckedSubterms :: GUncheckedSubterms f a => f a -> [a]
class GUncheckedRecursivelyShrink f
gUncheckedRecursivelyShrink :: GUncheckedRecursivelyShrink f => f a -> [f a]
class GGenUnchecked f
gGenUnchecked :: GGenUnchecked f => Gen (f a)

-- | A class of types for which invalid values can be generated.
class (Validity a, GenUnchecked a) => GenInvalid a
genInvalid :: GenInvalid a => Gen a
shrinkInvalid :: GenInvalid a => a -> [a]

-- | A class of types for which valid values can be generated.
--   
--   If you also write <tt>Arbitrary</tt> instances for <tt>GenValid</tt>
--   types, it may be best to simply write <tt>arbitrary = genValid</tt>.
class (Validity a, GenUnchecked a) => GenValid a
genValid :: GenValid a => Gen a
shrinkValid :: GenValid a => a -> [a]

-- | A class of types for which truly arbitrary values can be generated.
--   
--   <h3>Automatic instances with <a>Generic</a></h3>
--   
--   An instance of this class can be made automatically if the type in
--   question has a <a>Generic</a> instance. This instance will try to use
--   <a>genUnchecked</a> to generate all structural sub-parts of the value
--   that is being generated.
--   
--   Example:
--   
--   <pre>
--   {-# LANGUAGE DeriveGeneric #-}
--   
--   data MyType = MyType Double String
--       deriving (Show, Eq, Generic)
--   
--   instance GenUnchecked MyType
--   </pre>
--   
--   generates something like:
--   
--   <pre>
--   instance GenUnchecked MyType where
--       genUnchecked = MyType &lt;$&gt; genUnchecked &lt;*&gt; genUnchecked
--   </pre>
class GenUnchecked a
genUnchecked :: GenUnchecked a => Gen a
genUnchecked :: (GenUnchecked a, Generic a, GGenUnchecked (Rep a)) => Gen a
shrinkUnchecked :: GenUnchecked a => a -> [a]
shrinkUnchecked :: (GenUnchecked a, Generic a, GUncheckedRecursivelyShrink (Rep a), GUncheckedSubterms (Rep a) a) => a -> [a]
shrinkT2 :: (a -> [a]) -> (a, a) -> [(a, a)]
shrinkT3 :: (a -> [a]) -> (a, a, a) -> [(a, a, a)]

-- | <a>upTo</a> generates an integer between 0 (inclusive) and <tt>n</tt>.
upTo :: Int -> Gen Int

-- | 'genSplit a' generates a tuple '(b, c)' such that 'b + c' equals
--   <tt>a</tt>.
genSplit :: Int -> Gen (Int, Int)

-- | 'genSplit3 a' generates a triple '(b, c, d)' such that 'b + c + d'
--   equals <tt>a</tt>.
genSplit3 :: Int -> Gen (Int, Int, Int)

-- | 'genSplit4 a' generates a quadruple '(b, c, d, e)' such that 'b + c +
--   d + e' equals <tt>a</tt>.
genSplit4 :: Int -> Gen (Int, Int, Int, Int)

-- | 'genSplit5 a' generates a quadruple '(b, c, d, e, f)' such that 'b + c
--   + d + e + f' equals <tt>a</tt>.
genSplit5 :: Int -> Gen (Int, Int, Int, Int, Int)

-- | 'arbPartition n' generates a list <tt>ls</tt> such that 'sum ls'
--   equals <tt>n</tt>.
arbPartition :: Int -> Gen [Int]

-- | A version of <tt>listOf</tt> that takes size into account more
--   accurately.
genListOf :: Gen a -> Gen [a]

-- | Shrink a term to any of its immediate subterms, and also recursively
--   shrink all subterms.
gShrinkUnchecked :: (Generic a, GUncheckedRecursivelyShrink (Rep a), GUncheckedSubterms (Rep a) a) => a -> [a]

-- | Recursively shrink all immediate uncheckedSubterms.
uncheckedRecursivelyShrink :: (Generic a, GUncheckedRecursivelyShrink (Rep a)) => a -> [a]

-- | All immediate uncheckedSubterms of a term.
uncheckedSubterms :: (Generic a, GUncheckedSubterms (Rep a) a) => a -> [a]
instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubterms (f GHC.Generics.:*: g) a
instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubterms (f GHC.Generics.:+: g) a
instance Data.GenValidity.GUncheckedSubtermsIncl GHC.Generics.V1 a
instance Data.GenValidity.GUncheckedSubtermsIncl GHC.Generics.U1 a
instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubtermsIncl (f GHC.Generics.:*: g) a
instance (Data.GenValidity.GUncheckedSubtermsIncl f a, Data.GenValidity.GUncheckedSubtermsIncl g a) => Data.GenValidity.GUncheckedSubtermsIncl (f GHC.Generics.:+: g) a
instance Data.GenValidity.GUncheckedSubtermsIncl f a => Data.GenValidity.GUncheckedSubtermsIncl (GHC.Generics.M1 i c f) a
instance Data.GenValidity.GUncheckedSubtermsIncl (GHC.Generics.K1 i a) a
instance Data.GenValidity.GUncheckedSubtermsIncl (GHC.Generics.K1 i a) b
instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b) => Data.GenValidity.GenValid (a, b)
instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b) => Data.GenValidity.GenValid (Data.Either.Either a b)
instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b, Data.GenValidity.GenValid c) => Data.GenValidity.GenValid (a, b, c)
instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b, Data.GenValidity.GenValid c, Data.GenValidity.GenValid d) => Data.GenValidity.GenValid (a, b, c, d)
instance (Data.GenValidity.GenValid a, Data.GenValidity.GenValid b, Data.GenValidity.GenValid c, Data.GenValidity.GenValid d, Data.GenValidity.GenValid e) => Data.GenValidity.GenValid (a, b, c, d, e)
instance Data.GenValidity.GenValid a => Data.GenValidity.GenValid (GHC.Base.Maybe a)
instance Data.GenValidity.GenValid a => Data.GenValidity.GenValid (GHC.Base.NonEmpty a)
instance Data.GenValidity.GenValid a => Data.GenValidity.GenValid [a]
instance Data.GenValidity.GenValid ()
instance Data.GenValidity.GenValid GHC.Types.Bool
instance Data.GenValidity.GenValid GHC.Types.Ordering
instance Data.GenValidity.GenValid GHC.Types.Char
instance Data.GenValidity.GenValid GHC.Types.Int
instance Data.GenValidity.GenValid GHC.Int.Int8
instance Data.GenValidity.GenValid GHC.Int.Int16
instance Data.GenValidity.GenValid GHC.Int.Int32
instance Data.GenValidity.GenValid GHC.Int.Int64
instance Data.GenValidity.GenValid GHC.Types.Word
instance Data.GenValidity.GenValid GHC.Word.Word8
instance Data.GenValidity.GenValid GHC.Word.Word16
instance Data.GenValidity.GenValid GHC.Word.Word32
instance Data.GenValidity.GenValid GHC.Word.Word64
instance Data.GenValidity.GenValid GHC.Types.Float
instance Data.GenValidity.GenValid GHC.Types.Double
instance Data.GenValidity.GenValid GHC.Integer.Type.Integer
instance Data.GenValidity.GenValid GHC.Natural.Natural
instance (GHC.Real.Integral a, GHC.Num.Num a, GHC.Classes.Ord a, Data.GenValidity.GenValid a) => Data.GenValidity.GenValid (GHC.Real.Ratio a)
instance (GHC.Real.Integral a, GHC.Num.Num a, GHC.Classes.Ord a, Data.GenValidity.GenValid a) => Data.GenValidity.GenInvalid (GHC.Real.Ratio a)
instance Data.Fixed.HasResolution a => Data.GenValidity.GenValid (Data.Fixed.Fixed a)
instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b) => Data.GenValidity.GenInvalid (a, b)
instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b) => Data.GenValidity.GenInvalid (Data.Either.Either a b)
instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b, Data.GenValidity.GenInvalid c) => Data.GenValidity.GenInvalid (a, b, c)
instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b, Data.GenValidity.GenInvalid c, Data.GenValidity.GenInvalid d) => Data.GenValidity.GenInvalid (a, b, c, d)
instance (Data.GenValidity.GenInvalid a, Data.GenValidity.GenInvalid b, Data.GenValidity.GenInvalid c, Data.GenValidity.GenInvalid d, Data.GenValidity.GenInvalid e) => Data.GenValidity.GenInvalid (a, b, c, d, e)
instance Data.GenValidity.GenInvalid a => Data.GenValidity.GenInvalid (GHC.Base.Maybe a)
instance Data.GenValidity.GenInvalid a => Data.GenValidity.GenInvalid (GHC.Base.NonEmpty a)
instance Data.GenValidity.GenInvalid a => Data.GenValidity.GenInvalid [a]
instance Data.GenValidity.GenInvalid GHC.Types.Float
instance Data.GenValidity.GenInvalid GHC.Types.Double
instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b) => Data.GenValidity.GenUnchecked (a, b)
instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b) => Data.GenValidity.GenUnchecked (Data.Either.Either a b)
instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b, Data.GenValidity.GenUnchecked c) => Data.GenValidity.GenUnchecked (a, b, c)
instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b, Data.GenValidity.GenUnchecked c, Data.GenValidity.GenUnchecked d) => Data.GenValidity.GenUnchecked (a, b, c, d)
instance (Data.GenValidity.GenUnchecked a, Data.GenValidity.GenUnchecked b, Data.GenValidity.GenUnchecked c, Data.GenValidity.GenUnchecked d, Data.GenValidity.GenUnchecked e) => Data.GenValidity.GenUnchecked (a, b, c, d, e)
instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GenUnchecked (GHC.Base.Maybe a)
instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GenUnchecked [a]
instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GenUnchecked (GHC.Base.NonEmpty a)
instance Data.GenValidity.GenUnchecked ()
instance Data.GenValidity.GenUnchecked GHC.Types.Bool
instance Data.GenValidity.GenUnchecked GHC.Types.Ordering
instance Data.GenValidity.GenUnchecked GHC.Types.Char
instance Data.GenValidity.GenUnchecked GHC.Types.Int
instance Data.GenValidity.GenUnchecked GHC.Int.Int8
instance Data.GenValidity.GenUnchecked GHC.Int.Int16
instance Data.GenValidity.GenUnchecked GHC.Int.Int32
instance Data.GenValidity.GenUnchecked GHC.Int.Int64
instance Data.GenValidity.GenUnchecked GHC.Types.Word
instance Data.GenValidity.GenUnchecked GHC.Word.Word8
instance Data.GenValidity.GenUnchecked GHC.Word.Word16
instance Data.GenValidity.GenUnchecked GHC.Word.Word32
instance Data.GenValidity.GenUnchecked GHC.Word.Word64
instance Data.GenValidity.GenUnchecked GHC.Types.Float
instance Data.GenValidity.GenUnchecked GHC.Types.Double
instance Data.GenValidity.GenUnchecked GHC.Integer.Type.Integer
instance Data.GenValidity.GenUnchecked GHC.Natural.Natural
instance (GHC.Real.Integral a, Data.GenValidity.GenUnchecked a) => Data.GenValidity.GenUnchecked (GHC.Real.Ratio a)
instance Data.Fixed.HasResolution a => Data.GenValidity.GenUnchecked (Data.Fixed.Fixed a)
instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GGenUnchecked (GHC.Generics.K1 i a)
instance Data.GenValidity.GenUnchecked a => Data.GenValidity.GUncheckedRecursivelyShrink (GHC.Generics.K1 i a)
instance Data.GenValidity.GUncheckedSubterms GHC.Generics.V1 a
instance Data.GenValidity.GUncheckedSubterms GHC.Generics.U1 a
instance Data.GenValidity.GUncheckedSubterms f a => Data.GenValidity.GUncheckedSubterms (GHC.Generics.M1 i c f) a
instance Data.GenValidity.GUncheckedSubterms (GHC.Generics.K1 i a) b
instance (Data.GenValidity.GUncheckedRecursivelyShrink f, Data.GenValidity.GUncheckedRecursivelyShrink g) => Data.GenValidity.GUncheckedRecursivelyShrink (f GHC.Generics.:*: g)
instance (Data.GenValidity.GUncheckedRecursivelyShrink f, Data.GenValidity.GUncheckedRecursivelyShrink g) => Data.GenValidity.GUncheckedRecursivelyShrink (f GHC.Generics.:+: g)
instance Data.GenValidity.GUncheckedRecursivelyShrink f => Data.GenValidity.GUncheckedRecursivelyShrink (GHC.Generics.M1 i c f)
instance Data.GenValidity.GUncheckedRecursivelyShrink GHC.Generics.U1
instance Data.GenValidity.GUncheckedRecursivelyShrink GHC.Generics.V1
instance Data.GenValidity.GGenUnchecked GHC.Generics.U1
instance (Data.GenValidity.GGenUnchecked a, Data.GenValidity.GGenUnchecked b) => Data.GenValidity.GGenUnchecked (a GHC.Generics.:*: b)
instance (Data.GenValidity.GGenUnchecked a, Data.GenValidity.GGenUnchecked b) => Data.GenValidity.GGenUnchecked (a GHC.Generics.:+: b)
instance Data.GenValidity.GGenUnchecked a => Data.GenValidity.GGenUnchecked (GHC.Generics.M1 i c a)

module Data.GenRelativeValidity
class (GenUnchecked a, RelativeValidity a b, GenRelativeUnchecked a b) => GenRelativeInvalid a b
genInvalidFor :: GenRelativeInvalid a b => b -> Gen a
class (GenValid a, RelativeValidity a b) => GenRelativeValid a b
genValidFor :: GenRelativeValid a b => b -> Gen a
class (GenUnchecked a, RelativeValidity a b) => GenRelativeUnchecked a b
genUncheckedFor :: GenRelativeUnchecked a b => b -> Gen a
