import Prelude hiding (sequenceA, traverse)
import Control.Monad.Identity
import Data.Functor.Const

class (Functor t, Foldable t) => Traversable_ t where
    sequenceA :: Applicative f => t (f a) -> f (t a)
    sequenceA = traverse id

    traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
    traverse func = sequenceA . fmap func

fmapDefault :: Traversable_ t => (a -> b) -> t a -> t b
fmapDefault f ta =
  runIdentity $ traverse (Identity . f) ta

foldMapDefault :: (Traversable_ t, Monoid m) => (a -> m) -> t a -> m
foldMapDefault f ta =
  getConst $ traverse (Const . f) ta
