module Test.QuickCheck.Classes.Monoid.Factorial
( factorialMonoidLaws
)
where
import Prelude hiding
( dropWhile, foldl, length, null, reverse, span, splitAt, takeWhile )
import Data.Bifunctor
( Bifunctor (bimap) )
import Data.Function
( (&) )
import Data.List
( unfoldr )
import Data.Monoid.Factorial
( FactorialMonoid
, inits
, span
, split
, splitAt
, splitPrimePrefix
, splitPrimeSuffix
, tails
)
import Data.Monoid.Null
( null )
import Data.Proxy
( Proxy )
import Data.Semigroup.Factorial
( factors, length, primePrefix, primeSuffix, reverse )
import Data.Tuple
( swap )
import Internal
( cover, makeLaw1, makeProperty, report )
import Test.QuickCheck
( Arbitrary (arbitrary, shrink)
, Fun
, Property
, Testable
, applyFun
, chooseInt
, elements
, forAll
, forAllShrink
)
import Test.QuickCheck.Classes
( Laws (Laws) )
import qualified Data.List as L
factorialMonoidLaws
:: forall a. (Arbitrary a, Show a, Eq a, FactorialMonoid a)
=> Proxy a
-> Laws
factorialMonoidLaws :: forall a.
(Arbitrary a, Show a, Eq a, FactorialMonoid a) =>
Proxy a -> Laws
factorialMonoidLaws Proxy a
_ = String -> [(String, Property)] -> Laws
Laws String
"FactorialMonoid"
[ forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_coverage"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_coverage)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_null"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_null)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_splitPrimePrefix"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitPrimePrefix)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_splitPrimeSuffix"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitPrimeSuffix)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_reverse"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_reverse)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_primePrefix"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_primePrefix)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_primeSuffix"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_primeSuffix)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_inits"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_inits)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_tails"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_tails)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_span"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_span)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_split"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_split)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_split_intersperse"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_split_intersperse)
, forall a t.
(Arbitrary a, Show a, Eq a, Semigroup a, Testable t) =>
String -> (a -> t) -> (String, Property)
makeLaw1 @a
String
"factorialMonoidLaw_splitAt"
(forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitAt)
]
factorialMonoidLaw_coverage
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_coverage :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_coverage a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"True"
(Bool
True)
forall a b. a -> (a -> b) -> b
& forall t. Testable t => String -> Bool -> t -> Property
cover
String
"length a == 0"
(forall m. Factorial m => m -> Int
length a
a forall a. Eq a => a -> a -> Bool
== Int
0)
forall a b. a -> (a -> b) -> b
& forall t. Testable t => String -> Bool -> t -> Property
cover
String
"length a == 1"
(forall m. Factorial m => m -> Int
length a
a forall a. Eq a => a -> a -> Bool
== Int
1)
forall a b. a -> (a -> b) -> b
& forall t. Testable t => String -> Bool -> t -> Property
cover
String
"length a >= 2"
(forall m. Factorial m => m -> Int
length a
a forall a. Ord a => a -> a -> Bool
>= Int
2)
factorialMonoidLaw_null
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_null :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_null a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"null a == null (factors a)"
(forall m. MonoidNull m => m -> Bool
null a
a forall a. Eq a => a -> a -> Bool
== forall m. MonoidNull m => m -> Bool
null (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"null a"
(forall m. MonoidNull m => m -> Bool
null a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"null (factors a)"
(forall m. MonoidNull m => m -> Bool
null (forall m. Factorial m => m -> [m]
factors a
a))
factorialMonoidLaw_splitPrimePrefix
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitPrimePrefix :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitPrimePrefix a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"factors a == unfoldr splitPrimePrefix a"
(forall m. Factorial m => m -> [m]
factors a
a forall a. Eq a => a -> a -> Bool
== forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimePrefix a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"unfoldr splitPrimePrefix a"
(forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimePrefix a
a)
factorialMonoidLaw_splitPrimeSuffix
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitPrimeSuffix :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitPrimeSuffix a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"factors a == L.reverse (unfoldr (fmap swap . splitPrimeSuffix) a)"
(forall m. Factorial m => m -> [m]
factors a
a forall a. Eq a => a -> a -> Bool
== forall a. [a] -> [a]
L.reverse (forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> (b, a)
swap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimeSuffix) a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"unfoldr (fmap swap . splitPrimeSuffix) a"
(forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> (b, a)
swap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimeSuffix) a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"L.reverse (unfoldr (fmap swap . splitPrimeSuffix) a)"
(forall a. [a] -> [a]
L.reverse (forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> (b, a)
swap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimeSuffix) a
a))
factorialMonoidLaw_reverse
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_reverse :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_reverse a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"reverse a == mconcat (L.reverse (factors a))"
(forall m. Factorial m => m -> m
reverse a
a forall a. Eq a => a -> a -> Bool
== forall a. Monoid a => [a] -> a
mconcat (forall a. [a] -> [a]
L.reverse (forall m. Factorial m => m -> [m]
factors a
a)))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"reverse a"
(forall m. Factorial m => m -> m
reverse a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"L.reverse (factors a)"
(forall a. [a] -> [a]
L.reverse (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"mconcat (L.reverse (factors a))"
(forall a. Monoid a => [a] -> a
mconcat (forall a. [a] -> [a]
L.reverse (forall m. Factorial m => m -> [m]
factors a
a)))
factorialMonoidLaw_primePrefix
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_primePrefix :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_primePrefix a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"primePrefix a == maybe mempty fst (splitPrimePrefix a)"
(forall m. Factorial m => m -> m
primePrefix a
a forall a. Eq a => a -> a -> Bool
== forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall a b. (a, b) -> a
fst (forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimePrefix a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"primePrefix a"
(forall m. Factorial m => m -> m
primePrefix a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"splitPrimePrefix a"
(forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimePrefix a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"maybe mempty fst (splitPrimePrefix a)"
(forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall a b. (a, b) -> a
fst (forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimePrefix a
a))
factorialMonoidLaw_primeSuffix
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_primeSuffix :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_primeSuffix a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"primeSuffix a == maybe mempty snd (splitPrimeSuffix a)"
(forall m. Factorial m => m -> m
primeSuffix a
a forall a. Eq a => a -> a -> Bool
== forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall a b. (a, b) -> b
snd (forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimeSuffix a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"primeSuffix a"
(forall m. Factorial m => m -> m
primeSuffix a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"splitPrimeSuffix a"
(forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimeSuffix a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"maybe mempty snd (splitPrimeSuffix a)"
(forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall a b. (a, b) -> b
snd (forall m. FactorialMonoid m => m -> Maybe (m, m)
splitPrimeSuffix a
a))
factorialMonoidLaw_inits
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_inits :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_inits a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"inits a == fmap mconcat (L.inits (factors a))"
(forall m. FactorialMonoid m => m -> [m]
inits a
a forall a. Eq a => a -> a -> Bool
== forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Monoid a => [a] -> a
mconcat (forall a. [a] -> [[a]]
L.inits (forall m. Factorial m => m -> [m]
factors a
a)))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"inits a"
(forall m. FactorialMonoid m => m -> [m]
inits a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"L.inits (factors a)"
(forall a. [a] -> [[a]]
L.inits (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"fmap mconcat (L.inits (factors a))"
(forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Monoid a => [a] -> a
mconcat (forall a. [a] -> [[a]]
L.inits (forall m. Factorial m => m -> [m]
factors a
a)))
factorialMonoidLaw_tails
:: (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_tails :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_tails a
a =
forall t. Testable t => String -> t -> Property
makeProperty
String
"tails a == fmap mconcat (L.tails (factors a))"
(forall m. FactorialMonoid m => m -> [m]
tails a
a forall a. Eq a => a -> a -> Bool
== forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Monoid a => [a] -> a
mconcat (forall a. [a] -> [[a]]
L.tails (forall m. Factorial m => m -> [m]
factors a
a)))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"tails a"
(forall m. FactorialMonoid m => m -> [m]
tails a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"L.tails (factors a)"
(forall a. [a] -> [[a]]
L.tails (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"fmap mconcat (L.tails (factors a))"
(forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Monoid a => [a] -> a
mconcat (forall a. [a] -> [[a]]
L.tails (forall m. Factorial m => m -> [m]
factors a
a)))
factorialMonoidLaw_span
:: forall a. (Eq a, Show a, FactorialMonoid a)
=> a
-> Property
factorialMonoidLaw_span :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_span a
a = forall a b t.
(Show a, Show b, Arbitrary b, Testable t) =>
((a -> b) -> t) -> Property
withShowableFn forall a b. (a -> b) -> a -> b
$ \a -> Bool
p ->
forall t. Testable t => String -> t -> Property
makeProperty
String
"span p a == bimap mconcat mconcat (L.span p (factors a))"
(forall m. FactorialMonoid m => (m -> Bool) -> m -> (m, m)
span a -> Bool
p a
a forall a. Eq a => a -> a -> Bool
== forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap forall a. Monoid a => [a] -> a
mconcat forall a. Monoid a => [a] -> a
mconcat (forall a. (a -> Bool) -> [a] -> ([a], [a])
L.span a -> Bool
p (forall m. Factorial m => m -> [m]
factors a
a)))
forall a b. a -> (a -> b) -> b
& forall t. Testable t => String -> Bool -> t -> Property
cover
String
"any p (factors a)"
(forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any a -> Bool
p (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall t. Testable t => String -> Bool -> t -> Property
cover
String
"any (not . p) (factors a)"
(forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p) (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"span p a"
(forall m. FactorialMonoid m => (m -> Bool) -> m -> (m, m)
span a -> Bool
p a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"L.span p (factors a)"
(forall a. (a -> Bool) -> [a] -> ([a], [a])
L.span a -> Bool
p (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"bimap mconcat mconcat (L.span p (factors a))"
(forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap forall a. Monoid a => [a] -> a
mconcat forall a. Monoid a => [a] -> a
mconcat (forall a. (a -> Bool) -> [a] -> ([a], [a])
L.span a -> Bool
p (forall m. Factorial m => m -> [m]
factors a
a)))
factorialMonoidLaw_split
:: forall a. (Eq a, Show a, FactorialMonoid a)
=> a
-> Property
factorialMonoidLaw_split :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_split a
a = forall a b t.
(Show a, Show b, Arbitrary b, Testable t) =>
((a -> b) -> t) -> Property
withShowableFn forall a b. (a -> b) -> a -> b
$ \a -> Bool
p ->
forall t. Testable t => String -> t -> Property
makeProperty
String
"L.all (L.all (not . p) . factors) (split p a)"
(forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
L.all (forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
L.all (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall m. Factorial m => m -> [m]
factors) (forall m. FactorialMonoid m => (m -> Bool) -> m -> [m]
split a -> Bool
p a
a))
forall a b. a -> (a -> b) -> b
& forall t. Testable t => String -> Bool -> t -> Property
cover
String
"any p (factors a)"
(forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any a -> Bool
p (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall t. Testable t => String -> Bool -> t -> Property
cover
String
"any (not . p) (factors a)"
(forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p) (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"split p a"
(forall m. FactorialMonoid m => (m -> Bool) -> m -> [m]
split a -> Bool
p a
a)
factorialMonoidLaw_split_intersperse
:: forall a. (Eq a, Show a, FactorialMonoid a)
=> a
-> Property
factorialMonoidLaw_split_intersperse :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_split_intersperse a
a =
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll (forall a. [a] -> Gen a
elements (forall m. Factorial m => m -> [m]
factors a
a)) forall a b. (a -> b) -> a -> b
$ \a
p ->
forall t. Testable t => String -> t -> Property
makeProperty
String
"mconcat (L.intersperse p (split (== p) a)) == a"
(forall a. Monoid a => [a] -> a
mconcat (forall a. a -> [a] -> [a]
L.intersperse a
p (forall m. FactorialMonoid m => (m -> Bool) -> m -> [m]
split (forall a. Eq a => a -> a -> Bool
== a
p) a
a)) forall a. Eq a => a -> a -> Bool
== a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"split (== p) a"
(forall m. FactorialMonoid m => (m -> Bool) -> m -> [m]
split (forall a. Eq a => a -> a -> Bool
== a
p) a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"L.intersperse p (split (== p) a)"
(forall a. a -> [a] -> [a]
L.intersperse a
p (forall m. FactorialMonoid m => (m -> Bool) -> m -> [m]
split (forall a. Eq a => a -> a -> Bool
== a
p) a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"mconcat (L.intersperse p (split (== p) a))"
(forall a. Monoid a => [a] -> a
mconcat (forall a. a -> [a] -> [a]
L.intersperse a
p (forall m. FactorialMonoid m => (m -> Bool) -> m -> [m]
split (forall a. Eq a => a -> a -> Bool
== a
p) a
a)))
factorialMonoidLaw_splitAt
:: forall a. (Eq a, Show a, FactorialMonoid a)
=> a
-> Property
factorialMonoidLaw_splitAt :: forall a. (Eq a, Show a, FactorialMonoid a) => a -> Property
factorialMonoidLaw_splitAt a
a =
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> prop) -> Property
forAll ((Int, Int) -> Gen Int
chooseInt (Int
0, forall m. Factorial m => m -> Int
length a
a)) forall a b. (a -> b) -> a -> b
$ \Int
i ->
forall t. Testable t => String -> t -> Property
makeProperty
String
"splitAt i a == bimap mconcat mconcat (L.splitAt i (factors a))"
(forall m. FactorialMonoid m => Int -> m -> (m, m)
splitAt Int
i a
a forall a. Eq a => a -> a -> Bool
== forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap forall a. Monoid a => [a] -> a
mconcat forall a. Monoid a => [a] -> a
mconcat (forall a. Int -> [a] -> ([a], [a])
L.splitAt Int
i (forall m. Factorial m => m -> [m]
factors a
a)))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"splitAt i a"
(forall m. FactorialMonoid m => Int -> m -> (m, m)
splitAt Int
i a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"factors a"
(forall m. Factorial m => m -> [m]
factors a
a)
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"L.splitAt i (factors a)"
(forall a. Int -> [a] -> ([a], [a])
L.splitAt Int
i (forall m. Factorial m => m -> [m]
factors a
a))
forall a b. a -> (a -> b) -> b
& forall a prop.
(Show a, Testable prop) =>
String -> a -> prop -> Property
report
String
"bimap mconcat mconcat (L.splitAt i (factors a))"
(forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap forall a. Monoid a => [a] -> a
mconcat forall a. Monoid a => [a] -> a
mconcat (forall a. Int -> [a] -> ([a], [a])
L.splitAt Int
i (forall m. Factorial m => m -> [m]
factors a
a)))
withShowableFn
:: forall a b t. (Show a, Show b, Arbitrary b, Testable t)
=> ((a -> b) -> t)
-> Property
withShowableFn :: forall a b t.
(Show a, Show b, Arbitrary b, Testable t) =>
((a -> b) -> t) -> Property
withShowableFn (a -> b) -> t
t =
forall a prop.
(Show a, Testable prop) =>
Gen a -> (a -> [a]) -> (a -> prop) -> Property
forAllShrink (forall a. Arbitrary a => Gen a
arbitrary @(Fun String b)) forall a. Arbitrary a => a -> [a]
shrink forall a b. (a -> b) -> a -> b
$
\Fun String b
f -> (a -> b) -> t
t ((forall a b. Fun a b -> a -> b
applyFun Fun String b
f) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> String
show)