module Test.SmallCheck.Laws.Monoid
(
leftIdentity
, rightIdentity
, associativity
, associativitySum
, mconcatProp
) where
#if MIN_VERSION_base(4,8,0)
import Prelude hiding (mconcat)
#else
import Data.Monoid (Monoid, mappend, mempty)
import Data.Traversable (sequenceA)
#endif
import Data.Monoid ((<>))
import qualified Data.Monoid as Monoid (mconcat)
import Test.SmallCheck (Property, over)
import Test.SmallCheck.Series (Series)
import Test.SmallCheck.Series.Utils (zipLogic3)
leftIdentity
:: (Eq a, Monad m, Show a, Monoid a)
=> Series m a -> Property m
leftIdentity s = over s $ \x -> mempty <> x == x
rightIdentity
:: (Eq a, Monad m, Show a, Monoid a)
=> Series m a -> Property m
rightIdentity s = over s $ \x -> x <> mempty == x
associativity
:: (Eq a, Monad m, Show a, Monoid a)
=> Series m a -> Series m a -> Series m a -> Property m
associativity xs ys zs =
over xs $ \x ->
over ys $ \y ->
over zs $ \z ->
x <> (y <> z) == (x <> y) <> z
associativitySum
:: (Eq a, Monad m, Show a, Monoid a)
=> Series m a -> Series m a -> Series m a -> Property m
associativitySum xs ys zs =
over (zipLogic3 xs ys zs) $ \(x,y,z) ->
x <> (y <> z) == (x <> y) <> z
mconcatProp
:: (Eq a, Monad m, Show a, Monoid a)
=> Series m a -> Property m
mconcatProp s = over (sequenceA $ replicate 3 s) $ \l ->
Monoid.mconcat l == foldr mappend mempty l