packages feed

proton-0.0.4: src/Data/Profunctor/Writer.hs

module Data.Profunctor.Writer where

import Data.Profunctor
import Control.Category (Category)
import qualified Control.Category as C
import Data.Bifunctor (first)
import Data.Profunctor.Writer.Class

newtype WriterT w p a b = WriterT (p a (b, w))

instance Profunctor p => Profunctor (WriterT w p) where
  dimap f g (WriterT w) = WriterT (dimap f (first g) w)

instance (Monoid w, Category p, Strong p) => Category (WriterT w p) where
  id = WriterT (rmap (\b -> (b, mempty)) C.id)
  WriterT x . WriterT y = WriterT (rmap (\((c, w), w') -> (c, w <> w')) (first' x) C.. y)

instance (Profunctor p, Monoid w) => ProfunctorWriter' w (WriterT w p) where
  tell' (WriterT p) = WriterT (rmap (\((b, w), w') -> (b, w <> w')) p)
  listen' (WriterT p) = WriterT (rmap (\(b, w) -> ((b, w), w)) p)
  pass' (WriterT p) = WriterT (rmap (\((b, f), w) -> (b, f w)) p)