]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/scl/MMap.scl
Fix desktop product configuration
[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 iter :: (a -> b -> <e> ()) -> T a b -> <e,Proc> ()
40 iter f m = MSet.iter (\entry -> f (keyOf entry) (valueOf entry)) (entrySet m)
41
42 @inline
43 iterB :: (a -> b -> <e> Boolean) -> T a b -> <e,Proc> Boolean
44 iterB f m = MSet.iterB (\entry -> f (keyOf entry) (valueOf entry)) (entrySet m)
45
46 @inline
47 fold :: (a -> b -> c -> <e> a) -> a -> T b c -> <Proc,e> a
48 fold f init m = MSet.fold (\cur entry -> f cur (keyOf entry) (valueOf entry)) init (entrySet m)
49
50 importJava "gnu.trove.map.hash.THashMap" where
51     @JavaName "<init>"
52     create :: () -> <Proc> T a b
53     @JavaName "<init>"
54     createC :: Integer -> <Proc> T a b
55
56 fromEntryList :: [(a,b)] -> <Proc> T a b
57 fromEntryList l = do
58     result = createC (Prelude.length l)
59     Prelude.iter (\(k,v) -> Prelude.ignore (put result k v)) l
60     result
61     
62 putM ::  (b -> b -> b) -> T a b -> a -> b -> <Proc> ()
63 putM merge m k v = match get m k with
64     Just v2 -> Prelude.ignore (put m k (merge v v2))
65     Nothing -> Prelude.ignore (put m k v)
66
67 @inline
68 map :: (b -> <e> c) -> T a b -> <Proc,e> T a c
69 map f m = do
70     result = createC (size m)
71     iter (\k v -> Prelude.ignore (put result k (f v))) m
72     result
73
74 keys :: T a b -> <Proc> [a]
75 keys m = MSet.toList (keySet m)
76
77 values :: T a b -> <Proc> [b]
78 values m = do
79     result = MList.createC (size m)
80     Iterator.iter (MList.add result) (Iterator.iterator (values_ m))
81     MList.freeze result
82
83 entries :: T a b -> <Proc> [(a,b)]
84 entries m = do
85     result = MList.createC (size m)
86     iter (Prelude.curry (MList.add result)) m
87     MList.freeze result