{-# LANGUAGE DerivingVia #-} module Trace where import Data.Functor.Contravariant (Op(..), Contravariant) import Data.Monoid (Ap(..)) newtype Trace m a = Trace { runTrace :: a -> m () } deriving Contravariant via Op (m ()) deriving (Semigroup, Monoid) via Op (Ap m ()) a