]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/scl/SetClasses.scl
Implemented many type class instances for Set.T
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / SetClasses.scl
1 import "Prelude"
2 import "MSet" as MSet
3 import "Set" as Set
4
5 instance Functor Set.T where
6     fmap = map
7         
8 instance FunctorE Set.T where
9     map f set = runProc do
10         result = MSet.create ()
11         Set.iter (\x -> MSet.add result $ f x) set
12         MSet.freeze result
13         
14     iter = Set.iter
15     iterI = Set.iterI
16     
17 instance Monad Set.T where
18     return = Set.singleton
19     (>>=) = bindE
20
21 @private
22 importJava "java.util.Set" where
23     @JavaName addAll
24     addAll' :: MSet.T a -> Set.T a -> <Proc> Boolean
25         
26 instance MonadE Set.T where
27     set `bindE` f = runProc do
28         result = MSet.create ()
29         Set.iter (\x -> addAll' result $ f x) set
30         MSet.freeze result
31         
32 instance MonadZero Set.T where
33     mzero = Set.empty
34     
35 instance MonadZeroE Set.T where
36     filter p set = runProc do
37         result = MSet.create ()
38         Set.iter (\x ->
39             if p x
40             then ignore $ MSet.add result x
41             else ()
42         ) set
43         MSet.freeze result
44
45 instance (Show a) => Show (Set.T a) where
46     sb <+ set = do
47         sb << "{"
48         Set.iterI (\i x -> (if i > 0 then sb << ", " else sb) <+ x) set
49         sb << "}"
50
51 instance Additive (Set.T a) where
52     zero = Set.empty
53     a + b = runProc do
54         result = MSet.create ()
55         Set.iter (MSet.add result) a
56         Set.iter (MSet.add result) b
57         MSet.freeze result
58     sum sets = runProc do
59         result = MSet.create ()
60         iter (Set.iter (MSet.add result)) sets
61         MSet.freeze result