+-- | Registering a new tracer
+addTracer :: String -- ^ the tracer name
+ -> (String -> IO ()) -- ^ tracer
+ -> IO ()
+addTracer name tracer = do
+ ts <- readIORef tracers
+ writeIORef tracers ((name,tracer):filter (\(n,l) -> n /= name) ts)
+
+-- | Removing the tracer with the given name
+removeTracer :: String -> IO ()
+removeTracer name = do
+ ts <- readIORef tracers
+ writeIORef tracers (filter (\(n,l) -> n /= name) ts)
+
+-- | 'putTraceMsg' function outputs the trace message from IO monad.
+putTraceMsg :: String -> IO ()
+putTraceMsg msg = do
+ ts <- readIORef tracers
+ mapM_ (\(n,l) -> l msg) ts
+