{-# LANGUAGE FunctionalDependencies #-}

module Control.Arrow.Writer.Class where

import Prelude hiding ((.), id);

import Control.Arrow;
import Control.Category;

class Arrow r => ArrowWriter w r | r -> w where {
  tell :: r w ();
  look :: r a (a, w);
  censor :: (w -> w) -> r a b -> r a b;
};

looksA :: ArrowWriter w r => r w b -> r a (a, b);
looksA x = look >>> id *** x;

looks :: ArrowWriter w r => (w -> b) -> r a (a, b);
looks = looksA . arr;