-- | Functor laws
--
-- > fmap id = id
-- > fmap f . fmap g = fmap (f . g)
module Test.QuickCheck.Property.Functor (
module Test.QuickCheck.Property.Common
, prop_FunctorId
, prop_FunctorCompose
) where
import Test.QuickCheck.Property.Common
import Test.QuickCheck.Property.Common.Internal
-- | @fmap id = id@
prop_FunctorId :: Functor f => T (f a) -> f a -> Equal (f a)
prop_FunctorId T f = f .==. fmap id f
-- | It's not possible to generate arbitrary functions. Therefore they
-- are passed as arguments.
prop_FunctorCompose :: Functor f =>
(a -> b) -- ^ f
-> (b -> c) -- ^ g
-> T (f a)
-> f a
-> Equal (f c)
prop_FunctorCompose f g T x = (fmap g $ fmap f $ x) .==. (fmap (g . f) x)