]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.runtime/scl/MMap.scl
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / MMap.scl
diff --git a/bundles/org.simantics.scl.runtime/scl/MMap.scl b/bundles/org.simantics.scl.runtime/scl/MMap.scl
new file mode 100644 (file)
index 0000000..18e5866
--- /dev/null
@@ -0,0 +1,87 @@
+import "Prelude" as Prelude
+import "JavaBuiltin" as Java
+import "MSet" as MSet
+import "MList" as MList
+import "Iterator" as Iterator
+
+importJava "java.util.Map$Entry" where
+    data Entry a b
+    
+    @JavaName getKey
+    keyOf :: Entry a b -> a
+    @JavaName getValue
+    valueOf :: Entry a b -> b
+    
+importJava "java.util.Map" where
+    data T a b
+    
+    containsKey :: T a b -> a -> <Proc> Boolean
+    containsValue :: T a b -> b -> <Proc> Boolean
+    size :: T a b -> <Proc> Integer
+    isEmpty :: T a b -> <Proc> Boolean
+    entrySet :: T a b -> <Proc> MSet.T (Entry a b)
+    get :: T a b -> a -> <Proc> Maybe b
+    @JavaName get
+    unsafeGet :: T a b -> a -> <Proc> b
+    
+    // needs no <Proc>, because this is a view
+    keySet :: T a b -> MSet.T a
+    
+    @private
+    @JavaName values
+    values_ :: T a b -> Iterator.Iterable b
+    
+    put :: T a b -> a -> b -> <Proc> (Maybe b)
+    remove :: T a b -> a -> <Proc> (Maybe b)
+    clear :: T a b -> <Proc> ()
+
+@inline
+iter :: (a -> b -> <e> ()) -> T a b -> <e,Proc> ()
+iter f m = MSet.iter (\entry -> f (keyOf entry) (valueOf entry)) (entrySet m)
+
+@inline
+iterB :: (a -> b -> <e> Boolean) -> T a b -> <e,Proc> Boolean
+iterB f m = MSet.iterB (\entry -> f (keyOf entry) (valueOf entry)) (entrySet m)
+
+@inline
+fold :: (a -> b -> c -> <e> a) -> a -> T b c -> <Proc,e> a
+fold f init m = MSet.fold (\cur entry -> f cur (keyOf entry) (valueOf entry)) init (entrySet m)
+
+importJava "gnu.trove.map.hash.THashMap" where
+    @JavaName "<init>"
+    create :: () -> <Proc> T a b
+    @JavaName "<init>"
+    createC :: Integer -> <Proc> T a b
+
+fromEntryList :: [(a,b)] -> <Proc> T a b
+fromEntryList l = do
+    result = createC (Prelude.length l)
+    Prelude.iter (\(k,v) -> Prelude.ignore (put result k v)) l
+    result
+    
+putM ::  (b -> b -> b) -> T a b -> a -> b -> <Proc> ()
+putM merge m k v = match get m k with
+    Just v2 -> Prelude.ignore (put m k (merge v v2))
+    Nothing -> Prelude.ignore (put m k v)
+
+@inline
+map :: (b -> <e> c) -> T a b -> <Proc,e> T a c
+map f m = do
+    result = createC (size m)
+    iter (\k v -> Prelude.ignore (put result k (f v))) m
+    result
+
+keys :: T a b -> <Proc> [a]
+keys m = MSet.toList (keySet m)
+
+values :: T a b -> <Proc> [b]
+values m = do
+    result = MList.createC (size m)
+    Iterator.iter (MList.add result) (Iterator.iterator (values_ m))
+    MList.freeze result
+
+entries :: T a b -> <Proc> [(a,b)]
+entries m = do
+    result = MList.createC (size m)
+    iter (Prelude.curry (MList.add result)) m
+    MList.freeze result