packages feed

ide-backend-server-0.9.0: TraceMonad.hs

module TraceMonad where

import qualified Debug.Trace

import GHC
import MonadUtils

class Monad m => TraceMonad m where
  trace :: String -> m ()

traceBlock :: TraceMonad m => String -> m a -> m a
traceBlock str act = do
  trace $ "BKB " ++ str
  result <- act
  trace $ "BKA " ++ str
  return result

traceBlock' :: TraceMonad m => String -> ((m a -> m a) -> m a) -> m a
traceBlock' str act = traceBlock str $ act (traceBlock "-")

instance TraceMonad IO where
  trace = Debug.Trace.traceEventIO

instance TraceMonad Ghc where
  trace = liftIO . trace

-- | We cannot declare that every monad that implements MonadIO also
-- implements MonadTrace, so we provide a special function for this case
-- *mumbles hackhackhackhack..*
traceBlockIO :: MonadIO m => String -> m a -> m a
traceBlockIO str act = do
  liftIO $ trace $ "BKB " ++ str
  result <- act
  liftIO $ trace $ "BKA " ++ str
  return result