X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=c%CE%BBash%2FCLasH%2FUtils.hs;fp=c%CE%BBash%2FCLasH%2FUtils.hs;h=705a46603b42f3f4e4ab16dbbffecae7cd512dd2;hb=fcadaad2e47e5f6cba4b9f7d4341477b8fe74158;hp=c539c790125937b00363e77f0b333367a5c685ef;hpb=294beb3d9709eed0b5facdd42b2c91b65805de4b;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 c539c79..705a466 100644 --- "a/c\316\273ash/CLasH/Utils.hs" +++ "b/c\316\273ash/CLasH/Utils.hs" @@ -1,10 +1,14 @@ module CLasH.Utils ( listBindings , listBind + , makeCached ) where -- Standard Imports import qualified Maybe +import Data.Accessor +import qualified Data.Map as Map +import qualified Control.Monad.Trans.State as State -- GHC API import qualified CoreSyn @@ -46,4 +50,22 @@ listBind libdir filenames name = do listBinding (Maybe.fromJust $ head corebind, Maybe.fromJust $ head coreexpr) where bindFinder = findBind (hasVarName name) - exprFinder = findExpr (hasVarName name) \ No newline at end of file + exprFinder = findExpr (hasVarName name) + +-- Make a caching version of a stateful computatation. +makeCached :: (Monad m, Ord k) => + k -- ^ The key to use for the cache + -> Accessor s (Map.Map k v) -- ^ The accessor to get at the cache + -> State.StateT s m v -- ^ How to compute the value to cache? + -> State.StateT s m v -- ^ The resulting value, from the cache or freshly + -- computed. +makeCached key accessor create = do + cache <- getA 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) + return value