module CLasH.Utils where
import qualified Maybe
import Data.Accessor
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 Debug.Trace as Trace
makeCached :: (Monad m, Ord k) =>
k
-> Accessor s (Map.Map k v)
-> State.StateT s m v
-> State.StateT s m v
makeCached key accessor create = do
cache <- MonadState.get accessor
case Map.lookup key cache of
Just value -> return value
Nothing -> do
value <- create
MonadState.modify accessor (Map.insert key value)
return value
unzipM :: (Monad m) =>
m [(a, b)]
-> m ([a], [b])
unzipM = Monad.liftM unzip
catMaybesM :: (Monad m) =>
m [Maybe a]
-> m [a]
catMaybesM = Monad.liftM Maybe.catMaybes
concatM :: (Monad m) =>
m [[a]]
-> m [a]
concatM = Monad.liftM concat
isJustM :: (Monad m) => m (Maybe a) -> m Bool
isJustM = Monad.liftM Maybe.isJust
andM, orM :: (Monad m) => m [Bool] -> m Bool
andM = Monad.liftM and
orM = Monad.liftM or
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)
traceIf :: Bool -> String -> a -> a
traceIf True = Trace.trace
traceIf False = flip const