{-# LANGUAGE TypeOperators #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE FlexibleContexts #-} -- | A Trace effect for debugging module Control.Eff.Trace( Trace (..) , trace , runTrace ) where import Data.Typeable import Control.Eff -- | Trace effect for debugging data Trace v = Trace String (() -> v) deriving (Typeable, Functor) -- | Print a string as a trace. trace :: Member Trace r => String -> Eff r () trace x = send (inj . Trace x) -- | Run a computation producing Traces. runTrace :: Eff (Trace :> ()) w -> IO w runTrace m = loop (admin m) where loop (Val x) = return x loop (E u) = prjForce u $ \(Trace s k) -> putStrLn s >> loop (k ())