{-# 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 _ = genUnchecked

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

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