]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/scl/MMap.scl
085728c5830d14db6f991dca5a0c4b7a623d69a4
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / MMap.scl
1 import "Prelude" as Prelude
2 import "JavaBuiltin" as Java
3 import "MSet" as MSet
4 import "MList" as MList
5 import "Iterator" as Iterator
6
7 importJava "java.util.Map$Entry" where
8     data Entry a b
9     
10     @JavaName getKey
11     keyOf :: Entry a b -> a
12     @JavaName getValue
13     valueOf :: Entry a b -> b
14     
15 importJava "java.util.Map" where
16     data T a b
17     
18     containsKey :: T a b -> a -> <Proc> Boolean
19     containsValue :: T a b -> b -> <Proc> Boolean
20     size :: T a b -> <Proc> Integer
21     isEmpty :: T a b -> <Proc> Boolean
22     entrySet :: T a b -> <Proc> MSet.T (Entry a b)
23     get :: T a b -> a -> <Proc> Maybe b
24     @JavaName get
25     unsafeGet :: T a b -> a -> <Proc> b
26     
27     // needs no <Proc>, because this is a view
28     keySet :: T a b -> MSet.T a
29     
30     @private
31     @JavaName values
32     values_ :: T a b -> Iterator.Iterable b
33     
34     put :: T a b -> a -> b -> <Proc> (Maybe b)
35     remove :: T a b -> a -> <Proc> (Maybe b)
36     clear :: T a b -> <Proc> ()
37
38 @inline
39 getOrCreate :: T a b -> (a -> <e> b) ->  a -> <Proc,e> b
40 getOrCreate m f k = match get m k with
41     Just v -> v
42     Nothing -> do
43         v = f k
44         put m k v
45         v  
46
47 @inline
48 iter :: (a -> b -> <e> ()) -> T a b -> <e,Proc> ()
49 iter f m = MSet.iter (\entry -> f (keyOf entry) (valueOf entry)) (entrySet m)
50
51 @inline
52 iterB :: (a -> b -> <e> Boolean) -> T a b -> <e,Proc> Boolean
53 iterB f m = MSet.iterB (\entry -> f (keyOf entry) (valueOf entry)) (entrySet m)
54
55 @inline
56 fold :: (a -> b -> c -> <e> a) -> a -> T b c -> <Proc,e> a
57 fold f init m = MSet.fold (\cur entry -> f cur (keyOf entry) (valueOf entry)) init (entrySet m)
58
59 importJava "gnu.trove.map.hash.THashMap" where
60     @JavaName "<init>"
61     create :: () -> <Proc> T a b
62     @JavaName "<init>"
63     createC :: Integer -> <Proc> T a b
64
65 fromEntryList :: [(a,b)] -> <Proc> T a b
66 fromEntryList l = do
67     result = createC (Prelude.length l)
68     Prelude.iter (\(k,v) -> Prelude.ignore (put result k v)) l
69     result
70     
71 putM ::  (b -> b -> b) -> T a b -> a -> b -> <Proc> ()
72 putM merge m k v = match get m k with
73     Just v2 -> Prelude.ignore (put m k (merge v v2))
74     Nothing -> Prelude.ignore (put m k v)
75
76 @inline
77 map :: (b -> <e> c) -> T a b -> <Proc,e> T a c
78 map f m = do
79     result = createC (size m)
80     iter (\k v -> Prelude.ignore (put result k (f v))) m
81     result
82
83 keys :: T a b -> <Proc> [a]
84 keys m = MSet.toList (keySet m)
85
86 values :: T a b -> <Proc> [b]
87 values m = do
88     result = MList.createC (size m)
89     Iterator.iter (MList.add result) (Iterator.iterator (values_ m))
90     MList.freeze result
91
92 entries :: T a b -> <Proc> [(a,b)]
93 entries m = do
94     result = MList.createC (size m)
95     iter (Prelude.curry (MList.add result)) m
96     MList.freeze result