]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Added MMap.getOrCreate 18/1018/1
authorHannu Niemistö <hannu.niemisto@semantum.fi>
Mon, 25 Sep 2017 09:41:03 +0000 (12:41 +0300)
committerHannu Niemistö <hannu.niemisto@semantum.fi>
Mon, 25 Sep 2017 09:41:03 +0000 (12:41 +0300)
refs #7503

Change-Id: Ibc03b5c51365e4d5c2d2250fbf7265adc298a84a

bundles/org.simantics.scl.runtime/scl/MMap.scl

index 18e5866c080c05d35a6598c16e5382b63baa1a3f..085728c5830d14db6f991dca5a0c4b7a623d69a4 100644 (file)
@@ -35,6 +35,15 @@ importJava "java.util.Map" where
     remove :: T a b -> a -> <Proc> (Maybe b)
     clear :: T a b -> <Proc> ()
 
+@inline
+getOrCreate :: T a b -> (a -> <e> b) ->  a -> <Proc,e> b
+getOrCreate m f k = match get m k with
+    Just v -> v
+    Nothing -> do
+        v = f k
+        put m k v
+        v  
+
 @inline
 iter :: (a -> b -> <e> ()) -> T a b -> <e,Proc> ()
 iter f m = MSet.iter (\entry -> f (keyOf entry) (valueOf entry)) (entrySet m)