Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.14 KB | None | 0 0
  1. import Control.Applicative
  2. import Control.Monad
  3. import Control.Monad.Trans.Class
  4. import Control.Monad.Identity
  5.  
  6. newtype TraceT t m a = TraceT { runTraceT :: (t -> m ()) -> m a }
  7.  
  8. instance (Functor m) => Functor (TraceT t m) where
  9. fmap f ma = TraceT $ \tr -> f <$> runTraceT ma tr
  10.  
  11. instance (Applicative m) => Applicative (TraceT t m) where
  12. pure = liftTraceT . pure
  13. mf <*> ma = TraceT $ \tr -> runTraceT mf tr <*> runTraceT ma tr
  14.  
  15. instance (Monad m) => Monad (TraceT t m) where
  16. ma >>= f = TraceT $ \tr -> do
  17. a <- runTraceT ma tr
  18. runTraceT (f a) tr
  19.  
  20. instance MonadTrans (TraceT t) where
  21. lift = liftTraceT
  22.  
  23. liftTraceT :: m a -> TraceT t m a
  24. liftTraceT = TraceT . const
  25.  
  26. trace :: t -> TraceT t m ()
  27. trace t = TraceT ($t)
  28.  
  29. mute :: Applicative m => TraceT t m a -> TraceT t m a
  30. mute = alter (const (const (pure ())))
  31.  
  32. annotate :: Monad m => (t -> m ()) -> TraceT t m a -> TraceT t m a
  33. annotate tr2 = alter (\tr1 -> \t -> tr1 t >> tr2 t)
  34.  
  35. alter :: ((s -> m ()) -> (t -> m ())) -> TraceT t m a -> TraceT s m a
  36. alter f t = TraceT $ \tr -> runTraceT t (f tr)
  37.  
  38. mapTrace :: (s -> t) -> TraceT s m a -> TraceT t m a
  39. mapTrace f t = TraceT $ \tr -> runTraceT t (tr . f)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement