packages feed

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

module Data.Profunctor.Traced where

import Data.Profunctor
import Data.Bifunctor (first)

data Traced m a b = Traced ((a, m) -> b)

instance Profunctor (Traced m) where
  dimap f g (Traced t) = Traced (g . t . first f)

instance Strong (Traced m) where
  first' (Traced t) = Traced (first' t . reassoc)
    where
      reassoc ((a, c), m) = ((a, m), c)

instance Choice (Traced m) where
  left' (Traced t) = Traced (left' t . reassoc)
    where
      reassoc (Left a, m) = Left (a, m)
      reassoc (Right c, _) = Right c

extractTraced :: Monoid m => Traced m a b -> a -> b
extractTraced (Traced t) a = t (a, mempty)

-- extend :: Semigroup m => (Traced m x a -> b) -> Traced m x a -> Traced m x b
-- extend f (Traced t) = Traced go
--   where
--     go (x, m) = f $ Traced (\(x, m') -> t (x, m <> m'))