@@ -64,6 +64,8 @@ module Control.Tracer
6464 , condTracing
6565 , condTracingM
6666 , showTracing
67+ , traceTraversable
68+ , traceAll
6769 -- * Re-export of Contravariant
6870 , Contravariant (.. )
6971 ) where
@@ -73,6 +75,7 @@ import Control.Monad.IO.Class (MonadIO (..))
7375import Data.Functor.Contravariant (Contravariant (.. ))
7476import Data.Semigroup (Semigroup (.. ))
7577import Data.Monoid (Monoid (.. ))
78+ import Data.Foldable (traverse_ )
7679import Debug.Trace (traceM )
7780
7881-- | This type describes some effect in @m@ which depends upon some value of
@@ -108,7 +111,7 @@ import Debug.Trace (traceM)
108111newtype Tracer m a = Tracer { runTracer :: a -> m () }
109112
110113instance Contravariant (Tracer m ) where
111- contramap f ( Tracer g) = Tracer (g . f)
114+ contramap f = mapTracer ( . f)
112115
113116-- | @tr1 <> tr2@ will run @tr1@ and then @tr2@ with the same input.
114117instance Applicative m => Semigroup (Tracer m s ) where
@@ -137,7 +140,7 @@ contramapM :: Monad m
137140 => (a -> m b )
138141 -> Tracer m b
139142 -> Tracer m a
140- contramapM f ( Tracer tr) = Tracer (f >=> tr )
143+ contramapM f = mapTracer (f >=> )
141144
142145-- | Use a predicate to filter traced values: if it gives false then the
143146-- tracer will not be run.
@@ -154,11 +157,25 @@ condTracingM activeP tr = Tracer $ \s -> do
154157 active <- activeP
155158 when (active s) (traceWith tr s)
156159
160+ traceTraversable :: (Applicative m , Foldable t )
161+ => Tracer m a -> Tracer m (t a )
162+ traceTraversable = mapTracer traverse_
163+
164+ traceAll :: (Applicative m , Traversable t )
165+ => (b -> t a ) -> Tracer m a -> Tracer m b
166+ traceAll f = contramap f . traceTraversable
167+
168+ mapTracer :: ((a -> m () ) -> b -> n () )
169+ -> Tracer m a -> Tracer n b
170+ mapTracer f (Tracer tr) = Tracer (f tr)
171+
157172-- | Use a natural transformation to change the monad. This is useful, for
158173-- instance, to use concrete IO tracers in monad transformer stacks that have
159174-- IO as their base.
160- natTracer :: (forall x . m x -> n x ) -> Tracer m s -> Tracer n s
161- natTracer nat (Tracer tr) = Tracer (nat . tr)
175+ natTracer :: (forall x . m x -> n x )
176+ -> Tracer m a
177+ -> Tracer n a
178+ natTracer f = mapTracer (f . )
162179
163180-- | Trace strings to stdout. Output could be jumbled when this is used from
164181-- multiple threads. Consider 'debugTracer' instead.
0 commit comments