]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/scl/MSet.scl
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / MSet.scl
1 import "Prelude" as Prelude
2 import "JavaBuiltin" as Java
3 import "Iterator" as Iterator
4 import "Set" as Set
5 import "MList" as MList
6
7 importJava "java.util.Set" where
8     data T a
9     
10     contains :: T a -> a -> <Proc> Boolean
11     size :: T a -> <Proc> Integer
12     isEmpty :: T a -> <Proc> Boolean
13     
14     add :: T a -> a -> <Proc> Boolean
15     addAll :: T a -> [a] -> <Proc> Boolean
16     @JavaName addAll
17     addAllS :: T a -> T a -> <Proc> Boolean
18     remove :: T a -> a -> <Proc> Boolean
19     removeAll :: T a -> [a] -> <Proc> Boolean
20     clear :: T a -> <Proc> ()
21     
22     @private
23     iterator :: T a -> <Proc> Iterator.T a
24
25 @inline
26 iter :: (a -> <e> b) -> T a -> <e,Proc> ()
27 iter f s = Iterator.iter f (iterator s)
28
29 @inline
30 iterB :: (a -> <e> Boolean) -> T a -> <e,Proc> Boolean
31 iterB f s = Iterator.iterB f (iterator s)
32
33 map :: (a -> <e> b) -> T a -> <e,Proc> T b
34 map f set = result
35   where
36     result = createC (size set)
37     iter (\x -> add result (f x)) set
38
39 @inline
40 mapFirst :: (a -> <e> Maybe b) -> T a -> <e,Proc> Maybe b
41 mapFirst f s = Iterator.mapFirst f (iterator s)
42
43 @inline
44 fold :: (a -> b  -> <e> a) -> a -> T b -> <Proc,e> a
45 fold f init s = Iterator.fold f init (iterator s)
46
47 importJava "gnu.trove.set.hash.THashSet" where
48     @JavaName "<init>"
49     create :: () -> <Proc> T a
50     @JavaName "<init>"
51     createC :: Integer -> <Proc> T a
52
53 fromList :: [a] -> <Proc> T a
54 fromList l = do
55     result = createC (Prelude.length l)
56     Prelude.iter (\x -> Prelude.ignore (add result x)) l
57     result
58     
59 toList :: T a -> <Proc> [a]
60 toList s = do
61     result = MList.createC (size s)
62     iter (MList.add result) s
63     MList.freeze result
64
65 singleton :: a -> <Proc> T a
66 singleton v = do
67     result = createC 1
68     add result v
69     result
70
71 @inline
72 freeze :: T a -> <Proc> Set.T a
73 freeze = Java.unsafeCoerce
74
75 concatMap :: (a -> <e> T b) -> T a -> <Proc,e> T b
76 concatMap f s = result
77   where
78     result = create ()
79     iter (\el -> addAllS result (f el)) s
80
81 all :: (a -> <e> Boolean) -> T a -> <e,Proc> Boolean
82 all f s = Iterator.iterB f (iterator s) 
83
84 filterInPlace :: (a -> <e> Boolean) -> T a -> <e,Proc> ()
85 filterInPlace p s = Iterator.filter p (iterator s)