-- | QuickCheck integration for 'Predicate'
module Test.Predicates.QuickCheck (satisfies) where
import Test.Predicates (Predicate (accept, explain))
import Test.QuickCheck (Property, counterexample)
-- $setup
-- >>> :set -XExtendedDefaultRules
-- >>> :set -Wno-type-defaults
-- >>> import Test.Predicates
-- >>> import Test.QuickCheck
-- | QuickCheck property that checks if a predicate is satisfied.
--
-- @
-- quickCheck $ \\(Positive x) -> [0 .. x] \`satisfies\` (containsAll [eq 1, eq 2])
-- @
--
-- @
-- *** Failed! Falsified (after 1 test):
-- Positive {getPositive = 1}
-- Missing: 2
-- @
satisfies :: a -> Predicate a -> Property
x `satisfies` p = counterexample (explain p x) (accept p x)