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

import Data.Square
import Data.Profunctor
import qualified Data.Distributive as D

-- |
-- > +--t--+
-- > |  v  |
-- > f<-@-<f
-- > |  v  |
-- > +--t--+
--
-- @cotraverse = (funId ||| fromRight) === distribute === (toLeft ||| funId)@
cotraverse :: (D.Distributive t, Functor f) => Square '[Costar f] '[Costar f] '[t] '[t]
cotraverse = mkSquare (Costar . D.cotraverse . runCostar)

-- |
-- > +---t-f-+
-- > |   v v |
-- > | /-@-/ |
-- > | v v   |
-- > +-f-t---+
--
-- @distribute = fromRight ||| cotraverse ||| toLeft@
distribute :: (D.Distributive t, Functor f) => Square '[] '[] '[t, f] '[f, t]
distribute = fromRight ||| cotraverse ||| toLeft