module Data.Monoid.Laws where
import Data.Monoid
import Test.ClassLaws
data MonoidLaw1 m
data MonoidLaw2 m
data MonoidLaw3 m
class Monoid m => MonoidLaws m where
monoidLaw1 :: Law (MonoidLaw1 m)
monoidLaw2 :: Law (MonoidLaw2 m)
monoidLaw3 :: Law (MonoidLaw3 m)
monoidLaw1 = defaultMonoidLaw1
monoidLaw2 = defaultMonoidLaw2
monoidLaw3 = defaultMonoidLaw3
defaultMonoidLaw1 m = m =.= m `mappend` mempty
defaultMonoidLaw2 m = m `mappend` mempty =.= m
defaultMonoidLaw3 (m1,m2,m3) = m1 `mappend` (m2 `mappend` m3) =.= (m1 `mappend` m2) `mappend` m3
type instance LawArgs (MonoidLaw1 m) = m
type instance LawBody (MonoidLaw1 m) = m
type instance LawArgs (MonoidLaw2 m) = m
type instance LawBody (MonoidLaw2 m) = m
type instance LawArgs (MonoidLaw3 m) = (m, m, m)
type instance LawBody (MonoidLaw3 m) = m
instance (MonoidLaws a, TestEqual a) => LawTest (MonoidLaw1 a) where
lawtest _ = testEqual . monoidLaw1
instance (MonoidLaws a, TestEqual a) => LawTest (MonoidLaw2 a) where
lawtest _ = testEqual . monoidLaw2
instance (MonoidLaws a, TestEqual a) => LawTest (MonoidLaw3 a) where
lawtest _ = testEqual . monoidLaw3