{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE LambdaCase #-}

module Hedgehog.Classes.Traversable (traversableLaws) where

import Hedgehog
import Hedgehog.Classes.Common

import Data.Functor.Identity
import Data.Functor.Compose
import Data.Traversable (Traversable(..), foldMapDefault, fmapDefault)

-- | Tests the following 'Traversable' laws:
--
-- [__Naturality__]: @t '.' 'traverse' f@ ≡ @'traverse' (t '.' f), for every applicative transformation t@
-- [__Identity__]: @'traverse' 'Identity'@ ≡ @'Identity'@
-- [__Composition__]: @'traverse' ('Compose' '.' 'fmap' g '.' f)@ ≡ @'Compose' '.' 'fmap' ('traverse' g) '.' 'traverse' f@
-- [__SequenceA Naturality__]: @t '.' 'sequenceA'@ ≡ @'sequenceA' '.' 'fmap' t, for every applicative transformation t@
-- [__SequenceA Identity__]: @'sequenceA' '.' 'fmap' 'Identity'@ ≡ @'Identity'@
-- [__SequenceA Composition__]: @'sequenceA' '.' 'fmap' 'Compose'@ ≡ @'Compose' '.' 'fmap' 'sequenceA' '.' 'sequenceA'@
-- [__FoldMap__]: @'foldMap'@ ≡ @'foldMapDefault'@
-- [__Fmap__]: @'fmap'@ ≡ @'fmapDefault'@
traversableLaws ::
  ( Traversable f
  , forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)
  ) => (forall x. Gen x -> Gen (f x)) -> Laws
traversableLaws :: (forall x. Gen x -> Gen (f x)) -> Laws
traversableLaws forall x. Gen x -> Gen (f x)
gen = String -> [(String, Property)] -> Laws
Laws String
"Foldable"
  [ (String
"Naturality", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableNaturality forall x. Gen x -> Gen (f x)
gen)
  , (String
"Identity", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableIdentity forall x. Gen x -> Gen (f x)
gen)
  , (String
"Composition", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableComposition forall x. Gen x -> Gen (f x)
gen)
  , (String
"Sequence Naturality", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableSequenceNaturality forall x. Gen x -> Gen (f x)
gen)
  , (String
"Sequence Identity", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableSequenceIdentity forall x. Gen x -> Gen (f x)
gen)
  , (String
"Sequence Composition", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableSequenceComposition forall x. Gen x -> Gen (f x)
gen)
  , (String
"foldMap", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableFoldMap forall x. Gen x -> Gen (f x)
gen)
  , (String
"fmap", (forall x. Gen x -> Gen (f x)) -> Property
forall (f :: * -> *). TraversableProp f
traversableFmap forall x. Gen x -> Gen (f x)
gen)
  ]

type TraversableProp f =
  ( Traversable f
  , forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)
  ) => (forall x. Gen x -> Gen (f x)) -> Property

traversableNaturality :: TraversableProp f
traversableNaturality :: (forall x. Gen x -> Gen (f x)) -> Property
traversableNaturality forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  f Integer
a <- Gen (f Integer) -> PropertyT IO (f Integer)
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f Integer) -> PropertyT IO (f Integer))
-> Gen (f Integer) -> PropertyT IO (f Integer)
forall a b. (a -> b) -> a -> b
$ Gen Integer -> Gen (f Integer)
forall x. Gen x -> Gen (f x)
fgen Gen Integer
genSmallInteger
  (Compose Triple (Writer (Set Integer)) (f Integer)
-> Compose (Writer (Set Integer)) Triple (f Integer)
forall a.
Compose Triple (Writer (Set Integer)) a
-> Compose (Writer (Set Integer)) Triple a
apTrans ((Integer -> Compose Triple (Writer (Set Integer)) Integer)
-> f Integer -> Compose Triple (Writer (Set Integer)) (f Integer)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Integer -> Compose Triple (Writer (Set Integer)) Integer
func4 f Integer
a)) Compose (Writer (Set Integer)) Triple (f Integer)
-> Compose (Writer (Set Integer)) Triple (f Integer)
-> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` ((Integer -> Compose (Writer (Set Integer)) Triple Integer)
-> f Integer -> Compose (Writer (Set Integer)) Triple (f Integer)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Compose Triple (Writer (Set Integer)) Integer
-> Compose (Writer (Set Integer)) Triple Integer
forall a.
Compose Triple (Writer (Set Integer)) a
-> Compose (Writer (Set Integer)) Triple a
apTrans (Compose Triple (Writer (Set Integer)) Integer
 -> Compose (Writer (Set Integer)) Triple Integer)
-> (Integer -> Compose Triple (Writer (Set Integer)) Integer)
-> Integer
-> Compose (Writer (Set Integer)) Triple Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Compose Triple (Writer (Set Integer)) Integer
func4) f Integer
a)

traversableIdentity :: TraversableProp f
traversableIdentity :: (forall x. Gen x -> Gen (f x)) -> Property
traversableIdentity forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  f Integer
t <- Gen (f Integer) -> PropertyT IO (f Integer)
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f Integer) -> PropertyT IO (f Integer))
-> Gen (f Integer) -> PropertyT IO (f Integer)
forall a b. (a -> b) -> a -> b
$ Gen Integer -> Gen (f Integer)
forall x. Gen x -> Gen (f x)
fgen Gen Integer
genSmallInteger
  ((Integer -> Identity Integer) -> f Integer -> Identity (f Integer)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Integer -> Identity Integer
forall a. a -> Identity a
Identity f Integer
t) Identity (f Integer) -> Identity (f Integer) -> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` (f Integer -> Identity (f Integer)
forall a. a -> Identity a
Identity f Integer
t)

traversableComposition :: TraversableProp f
traversableComposition :: (forall x. Gen x -> Gen (f x)) -> Property
traversableComposition forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  f Integer
t <- Gen (f Integer) -> PropertyT IO (f Integer)
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f Integer) -> PropertyT IO (f Integer))
-> Gen (f Integer) -> PropertyT IO (f Integer)
forall a b. (a -> b) -> a -> b
$ Gen Integer -> Gen (f Integer)
forall x. Gen x -> Gen (f x)
fgen Gen Integer
genSmallInteger 
  let lhs :: Compose Triple Triple (f Integer)
lhs = ((Integer -> Compose Triple Triple Integer)
-> f Integer -> Compose Triple Triple (f Integer)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (Triple (Triple Integer) -> Compose Triple Triple Integer
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose (Triple (Triple Integer) -> Compose Triple Triple Integer)
-> (Integer -> Triple (Triple Integer))
-> Integer
-> Compose Triple Triple Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Triple Integer)
-> Triple Integer -> Triple (Triple Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Integer -> Triple Integer
func5 (Triple Integer -> Triple (Triple Integer))
-> (Integer -> Triple Integer)
-> Integer
-> Triple (Triple Integer)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Triple Integer
func6) f Integer
t)
  let rhs :: Compose Triple Triple (f Integer)
rhs = (Triple (Triple (f Integer)) -> Compose Triple Triple (f Integer)
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose ((f Integer -> Triple (f Integer))
-> Triple (f Integer) -> Triple (Triple (f Integer))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Integer -> Triple Integer) -> f Integer -> Triple (f Integer)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Integer -> Triple Integer
func5) ((Integer -> Triple Integer) -> f Integer -> Triple (f Integer)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse Integer -> Triple Integer
func6 f Integer
t)))
  Compose Triple Triple (f Integer)
lhs Compose Triple Triple (f Integer)
-> Compose Triple Triple (f Integer) -> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` Compose Triple Triple (f Integer)
rhs

traversableSequenceNaturality :: TraversableProp f
traversableSequenceNaturality :: (forall x. Gen x -> Gen (f x)) -> Property
traversableSequenceNaturality forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  f (Compose Triple ((,) (Set Integer)) Integer)
x <- Gen (f (Compose Triple ((,) (Set Integer)) Integer))
-> PropertyT IO (f (Compose Triple ((,) (Set Integer)) Integer))
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f (Compose Triple ((,) (Set Integer)) Integer))
 -> PropertyT IO (f (Compose Triple ((,) (Set Integer)) Integer)))
-> Gen (f (Compose Triple ((,) (Set Integer)) Integer))
-> PropertyT IO (f (Compose Triple ((,) (Set Integer)) Integer))
forall a b. (a -> b) -> a -> b
$ Gen (Compose Triple ((,) (Set Integer)) Integer)
-> Gen (f (Compose Triple ((,) (Set Integer)) Integer))
forall x. Gen x -> Gen (f x)
fgen (Gen Integer
-> (forall x. Gen x -> Gen (Triple x))
-> (forall x. Gen x -> Gen (Set Integer, x))
-> Gen (Compose Triple ((,) (Set Integer)) Integer)
forall (f :: * -> *) (g :: * -> *) a.
Gen a
-> (forall x. Gen x -> Gen (f x))
-> (forall x. Gen x -> Gen (g x))
-> Gen (Compose f g a)
genCompose Gen Integer
genSmallInteger forall x. Gen x -> Gen (Triple x)
genTriple (Gen (Set Integer) -> Gen x -> Gen (Set Integer, x)
forall a b. Gen a -> Gen b -> Gen (a, b)
genTuple Gen (Set Integer)
genSetInteger))
  let a :: f (Compose Triple (Writer (Set Integer)) Integer)
a = (Compose Triple ((,) (Set Integer)) Integer
 -> Compose Triple (Writer (Set Integer)) Integer)
-> f (Compose Triple ((,) (Set Integer)) Integer)
-> f (Compose Triple (Writer (Set Integer)) Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Compose Triple ((,) (Set Integer)) Integer
-> Compose Triple (Writer (Set Integer)) Integer
toSpecialApplicative f (Compose Triple ((,) (Set Integer)) Integer)
x
  (Compose Triple (Writer (Set Integer)) (f Integer)
-> Compose (Writer (Set Integer)) Triple (f Integer)
forall a.
Compose Triple (Writer (Set Integer)) a
-> Compose (Writer (Set Integer)) Triple a
apTrans (f (Compose Triple (Writer (Set Integer)) Integer)
-> Compose Triple (Writer (Set Integer)) (f Integer)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA f (Compose Triple (Writer (Set Integer)) Integer)
a)) Compose (Writer (Set Integer)) Triple (f Integer)
-> Compose (Writer (Set Integer)) Triple (f Integer)
-> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` (f (Compose (Writer (Set Integer)) Triple Integer)
-> Compose (Writer (Set Integer)) Triple (f Integer)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA ((Compose Triple (Writer (Set Integer)) Integer
 -> Compose (Writer (Set Integer)) Triple Integer)
-> f (Compose Triple (Writer (Set Integer)) Integer)
-> f (Compose (Writer (Set Integer)) Triple Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Compose Triple (Writer (Set Integer)) Integer
-> Compose (Writer (Set Integer)) Triple Integer
forall a.
Compose Triple (Writer (Set Integer)) a
-> Compose (Writer (Set Integer)) Triple a
apTrans f (Compose Triple (Writer (Set Integer)) Integer)
a)) 

traversableSequenceIdentity :: TraversableProp f
traversableSequenceIdentity :: (forall x. Gen x -> Gen (f x)) -> Property
traversableSequenceIdentity forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  f Integer
t <- Gen (f Integer) -> PropertyT IO (f Integer)
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f Integer) -> PropertyT IO (f Integer))
-> Gen (f Integer) -> PropertyT IO (f Integer)
forall a b. (a -> b) -> a -> b
$ Gen Integer -> Gen (f Integer)
forall x. Gen x -> Gen (f x)
fgen Gen Integer
genSmallInteger
  (f (Identity Integer) -> Identity (f Integer)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA ((Integer -> Identity Integer) -> f Integer -> f (Identity Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Integer -> Identity Integer
forall a. a -> Identity a
Identity f Integer
t)) Identity (f Integer) -> Identity (f Integer) -> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` (f Integer -> Identity (f Integer)
forall a. a -> Identity a
Identity f Integer
t)

traversableSequenceComposition :: TraversableProp f
traversableSequenceComposition :: (forall x. Gen x -> Gen (f x)) -> Property
traversableSequenceComposition forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  let genTripleInteger :: Gen (Triple Integer)
genTripleInteger = Gen Integer -> Gen (Triple Integer)
forall x. Gen x -> Gen (Triple x)
genTriple Gen Integer
genSmallInteger
  f (Triple (Triple Integer))
t <- Gen (f (Triple (Triple Integer)))
-> PropertyT IO (f (Triple (Triple Integer)))
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f (Triple (Triple Integer)))
 -> PropertyT IO (f (Triple (Triple Integer))))
-> Gen (f (Triple (Triple Integer)))
-> PropertyT IO (f (Triple (Triple Integer)))
forall a b. (a -> b) -> a -> b
$ Gen (Triple (Triple Integer)) -> Gen (f (Triple (Triple Integer)))
forall x. Gen x -> Gen (f x)
fgen (Gen (Triple Integer) -> Gen (Triple (Triple Integer))
forall x. Gen x -> Gen (Triple x)
genTriple Gen (Triple Integer)
genTripleInteger)
  (f (Compose Triple Triple Integer)
-> Compose Triple Triple (f Integer)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA ((Triple (Triple Integer) -> Compose Triple Triple Integer)
-> f (Triple (Triple Integer)) -> f (Compose Triple Triple Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Triple (Triple Integer) -> Compose Triple Triple Integer
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose f (Triple (Triple Integer))
t)) Compose Triple Triple (f Integer)
-> Compose Triple Triple (f Integer) -> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` (Triple (Triple (f Integer)) -> Compose Triple Triple (f Integer)
forall k k1 (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose ((f (Triple Integer) -> Triple (f Integer))
-> Triple (f (Triple Integer)) -> Triple (Triple (f Integer))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap f (Triple Integer) -> Triple (f Integer)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA (f (Triple (Triple Integer)) -> Triple (f (Triple Integer))
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA f (Triple (Triple Integer))
t)))

traversableFoldMap :: TraversableProp f
traversableFoldMap :: (forall x. Gen x -> Gen (f x)) -> Property
traversableFoldMap forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  f Integer
t <- Gen (f Integer) -> PropertyT IO (f Integer)
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f Integer) -> PropertyT IO (f Integer))
-> Gen (f Integer) -> PropertyT IO (f Integer)
forall a b. (a -> b) -> a -> b
$ Gen Integer -> Gen (f Integer)
forall x. Gen x -> Gen (f x)
fgen Gen Integer
genSmallInteger
  (Integer -> Sum Integer) -> f Integer -> Sum Integer
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Integer -> Sum Integer
func3 f Integer
t Sum Integer -> Sum Integer -> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` (Integer -> Sum Integer) -> f Integer -> Sum Integer
forall (t :: * -> *) m a.
(Traversable t, Monoid m) =>
(a -> m) -> t a -> m
foldMapDefault Integer -> Sum Integer
func3 f Integer
t  

traversableFmap :: TraversableProp f
traversableFmap :: (forall x. Gen x -> Gen (f x)) -> Property
traversableFmap forall x. Gen x -> Gen (f x)
fgen = HasCallStack => PropertyT IO () -> Property
PropertyT IO () -> Property
property (PropertyT IO () -> Property) -> PropertyT IO () -> Property
forall a b. (a -> b) -> a -> b
$ do
  f Integer
t <- Gen (f Integer) -> PropertyT IO (f Integer)
forall (m :: * -> *) a.
(Monad m, Show a, HasCallStack) =>
Gen a -> PropertyT m a
forAll (Gen (f Integer) -> PropertyT IO (f Integer))
-> Gen (f Integer) -> PropertyT IO (f Integer)
forall a b. (a -> b) -> a -> b
$ Gen Integer -> Gen (f Integer)
forall x. Gen x -> Gen (f x)
fgen Gen Integer
genSmallInteger
  (Integer -> Sum Integer) -> f Integer -> f (Sum Integer)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Integer -> Sum Integer
func3 f Integer
t f (Sum Integer) -> f (Sum Integer) -> PropertyT IO ()
forall (m :: * -> *) a (f :: * -> *).
(MonadTest m, HasCallStack, Eq a, Show a,
 forall x. Eq x => Eq (f x), forall x. Show x => Show (f x)) =>
f a -> f a -> m ()
`heq1` (Integer -> Sum Integer) -> f Integer -> f (Sum Integer)
forall (t :: * -> *) a b. Traversable t => (a -> b) -> t a -> t b
fmapDefault Integer -> Sum Integer
func3 f Integer
t