squares-0.1.1: src/Data/Foldable/Square.hs
{-# 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
import Control.Applicative
-- |
-- > +--t--+
-- > | 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 t, Monoid m, IsFList gs) => Square '[Forget m] '[Forget m] '[t] gs
foldMap = mkSquare (Forget . F.foldMap . runForget)
-- | `Data.Foldable.Square.any` is `Data.Foldable.Square.foldMap` specialized to `Data.Monoid.Any`.
any :: (Foldable t, IsFList gs) => Square '[Forget Bool] '[Forget Bool] '[t] gs
any = mkSquare (Forget . F.any . runForget)
-- | `Data.Foldable.Square.all` is `Data.Foldable.Square.foldMap` specialized to `Data.Monoid.All`.
all :: (Foldable t, IsFList gs) => Square '[Forget Bool] '[Forget Bool] '[t] gs
all = mkSquare (Forget . F.all . runForget)
-- |
-- > +--t--+
-- > | v |
-- > f>-@->f
-- > | |
-- > +-----+
--
-- `afoldMap` is a mapping version of `F.asum`, or a generalization of `F.concatMap`.
afoldMap :: (Foldable t, Alternative f) => Square '[Star f] '[Star f] '[t] '[]
afoldMap = mkSquare (Star . (\f -> foldr ((<|>) . f) empty) . runStar)