]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.runtime/scl/MList.scl
Added first and last functions to MList module
[simantics/platform.git] / bundles / org.simantics.scl.runtime / scl / MList.scl
1 import "Prelude" as Prelude
2 import "JavaBuiltin" as Java
3 import "Iterator" as Iterator
4
5 importJava "java.util.List" where
6     data T a
7     
8     contains :: T a -> a -> <Proc> Boolean
9     size :: T a -> <Proc> Integer
10     isEmpty :: T a -> <Proc> Boolean
11     get :: T a -> Integer -> <Proc> a
12     set :: T a -> Integer -> a -> <Proc> Maybe a
13     
14     add :: T a -> a -> <Proc> ()
15     addAll :: T a -> [a] -> <Proc> ()
16     remove :: T a -> Integer -> <Proc> a
17     clear :: T a -> <Proc> ()
18     
19     @private
20     iterator :: T a -> <Proc> Iterator.T a
21
22 removeLast :: T a -> <Proc> Maybe a
23 removeLast l = if isEmpty l
24                then Nothing
25                else Just (remove l (Java.isub (size l) 1))
26
27 "Returns the first element of a list"
28 @inline
29 first :: T a -> <Proc> a
30 first s = get s 0
31
32 "Returns the last element of a list"
33 @inline
34 last :: T a -> <Proc> a
35 last s = get s (Java.isub (size s) 1)
36
37 @inline
38 iter :: (a -> <e> ()) -> T a -> <e,Proc> ()
39 iter f s = Iterator.iter f (iterator s)
40
41 @inline
42 iterB :: (a -> <e> Boolean) -> T a -> <e,Proc> Boolean
43 iterB f s = Iterator.iterB f (iterator s)
44
45 @inline
46 fold :: (a -> b  -> <e> a) -> a -> T b -> <Proc,e> a
47 fold f init s = Iterator.fold f init (iterator s)
48
49 importJava "java.util.ArrayList" where
50     @JavaName "<init>"
51     create :: () -> <Proc> T a
52     @JavaName "<init>"
53     createC :: Integer -> <Proc> T a
54
55 fromList :: [a] -> <Proc> T a
56 fromList l = do
57     result = createC (Prelude.length l)
58     Prelude.iter (\x -> Prelude.ignore (add result x)) l
59     result
60
61 singleton :: a -> <Proc> T a
62 singleton v = do
63     result = createC 2
64     add result v
65     result
66
67 @inline
68 freeze :: T a -> <Proc> [a]
69 freeze = Java.unsafeCoerce