X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=c%CE%BBash%2FCLasH%2FUtils.hs;h=2966757a038b1d2fefd6a9db51547a0bcf8d0bff;hb=31aaefbc8c86e9fff93fa4fbeaec3302c4679282;hp=822bd55dae5c7bb286552f08178dce7600ab5009;hpb=363508934b28a8d22af5689e87a0013aa2f935fa;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git "a/c\316\273ash/CLasH/Utils.hs" "b/c\316\273ash/CLasH/Utils.hs" index 822bd55..2966757 100644 --- "a/c\316\273ash/CLasH/Utils.hs" +++ "b/c\316\273ash/CLasH/Utils.hs" @@ -3,13 +3,10 @@ module CLasH.Utils where -- Standard Imports 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 - --- GHC API - --- Local Imports -- Make a caching version of a stateful computatation. makeCached :: (Monad m, Ord k) => @@ -19,14 +16,14 @@ makeCached :: (Monad m, Ord k) => -> State.StateT s m v -- ^ The resulting value, from the cache or freshly -- computed. makeCached key accessor create = do - cache <- getA accessor + cache <- MonadState.get accessor case Map.lookup key cache of -- Found in cache, just return Just value -> return value -- Not found, compute it and put it in the cache Nothing -> do value <- create - modA accessor (Map.insert key value) + MonadState.modify accessor (Map.insert key value) return value unzipM :: (Monad m) => @@ -50,3 +47,16 @@ isJustM = Monad.liftM Maybe.isJust andM, orM :: (Monad m) => m [Bool] -> m Bool 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)