{-# LANGUAGE DataKinds #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Data.Foldable.Square
-- License     :  BSD-style (see the file LICENSE)
-- Maintainer  :  sjoerd@w3future.com
--
-----------------------------------------------------------------------------
module Data.Foldable.Square where

import Data.Square
import Data.Profunctor
import Data.Functor.Compose.List
import qualified Data.Foldable as F

-- |
-- > +--f--+
-- > |  v  |
-- > !m-@-!m
-- > |  ?  |
-- > +--?--+
--
-- `F.foldMap` as a square. Note that because `Forget` ignores its output parameter,
-- this square can have any list of functors as output type.
foldMap :: (Foldable f, Monoid m, IsFList gs) => Square '[Forget m] '[Forget m] '[f] gs
foldMap = mkSquare (Forget . F.foldMap . runForget)