{-# LANGUAGE MultiParamTypeClasses #-}

module Data.GenRelativeValidity
    ( module Data.RelativeValidity
    , module Data.GenRelativeValidity
    ) where

import Data.GenValidity
import Data.RelativeValidity

import Test.QuickCheck

class (GenUnchecked a, RelativeValidity a b) =>
      GenRelativeUnchecked a b where
    genUncheckedFor :: b -> Gen a
    genUncheckedFor _ = Gen a
forall a. GenUnchecked a => Gen a
genUnchecked

class (GenValid a, RelativeValidity a b) =>
      GenRelativeValid a b where
    genValidFor :: b -> Gen a
    genValidFor b :: b
b = Gen a
forall a. GenValid a => Gen a
genValid Gen a -> (a -> Bool) -> Gen a
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` (a -> b -> Bool
forall a b. RelativeValidity a b => a -> b -> Bool
`isValidFor` b
b)

class (GenUnchecked a, RelativeValidity a b, GenRelativeUnchecked a b) =>
      GenRelativeInvalid a b where
    genInvalidFor :: b -> Gen a
    genInvalidFor b :: b
b = b -> Gen a
forall a b. GenRelativeUnchecked a b => b -> Gen a
genUncheckedFor b
b Gen a -> (a -> Bool) -> Gen a
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` (Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b -> Bool
forall a b. RelativeValidity a b => a -> b -> Bool
`isValidFor` b
b))