Add unzipM helper function.
[matthijs/master-project/cλash.git] / cλash / CLasH / Utils.hs
index c539c790125937b00363e77f0b333367a5c685ef..3ce4b9ef37c3c6e8dd8d0661fe8f78c8095cc277 100644 (file)
@@ -1,10 +1,11 @@
-module CLasH.Utils
-  ( listBindings
-  , listBind
-  ) where
+module CLasH.Utils where
 
 -- Standard Imports
 import qualified Maybe
+import Data.Accessor
+import qualified Data.Map as Map
+import qualified Control.Monad as Monad
+import qualified Control.Monad.Trans.State as State
 
 -- GHC API
 import qualified CoreSyn
@@ -46,4 +47,27 @@ 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
+
+unzipM :: (Monad m) =>
+  m [(a, b)]
+  -> m ([a], [b])
+unzipM = Monad.liftM unzip