Add traceIf function for conditional tracing.
[matthijs/master-project/cλash.git] / cλash / CLasH / Utils.hs
index 41d7beee98a635083b2ad0c66d7aedbfc9403c46..d85b25b5f415a817a82f54fa5471e1ef5b1aa409 100644 (file)
@@ -7,6 +7,7 @@ import qualified Data.Accessor.Monad.Trans.State as MonadState
 import qualified Data.Map as Map
 import qualified Control.Monad as Monad
 import qualified Control.Monad.Trans.State as State
 import qualified Data.Map as Map
 import qualified Control.Monad as Monad
 import qualified Control.Monad.Trans.State as State
+import qualified Debug.Trace as Trace
   
 -- Make a caching version of a stateful computatation.
 makeCached :: (Monad m, Ord k) =>
   
 -- Make a caching version of a stateful computatation.
 makeCached :: (Monad m, Ord k) =>
@@ -48,9 +49,21 @@ andM, orM :: (Monad m) => m [Bool] -> m Bool
 andM = Monad.liftM and
 orM = Monad.liftM or
 
 andM = Monad.liftM and
 orM = Monad.liftM or
 
+-- | Monadic versions of any and all. We reimplement them, since there
+-- is no ready-made lifting function for them.
+allM, anyM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool
+allM f = andM . (mapM f)
+anyM f = orM . (mapM f)
+
 mapAccumLM :: (Monad m) => (acc -> x -> m (acc, y)) -> acc -> [x] -> m (acc, [y])
 mapAccumLM _ s []        =  return (s, [])
 mapAccumLM f s (x:xs)    =  do
   (s',  y ) <- f s x
   (s'', ys) <- mapAccumLM f s' xs
   return (s'', y:ys)
 mapAccumLM :: (Monad m) => (acc -> x -> m (acc, y)) -> acc -> [x] -> m (acc, [y])
 mapAccumLM _ s []        =  return (s, [])
 mapAccumLM f s (x:xs)    =  do
   (s',  y ) <- f s x
   (s'', ys) <- mapAccumLM f s' xs
   return (s'', y:ys)
+
+-- Trace the given string if the given bool is True, do nothing
+-- otherwise.
+traceIf :: Bool -> String -> a -> a
+traceIf True = Trace.trace
+traceIf False = flip const