1 package org.simantics.scl.runtime;
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Comparator;
6 import java.util.Iterator;
9 import org.simantics.scl.runtime.function.Function;
10 import org.simantics.scl.runtime.function.FunctionImpl1;
11 import org.simantics.scl.runtime.function.FunctionImpl2;
12 import org.simantics.scl.runtime.tuple.Tuple2;
14 import gnu.trove.map.hash.TCustomHashMap;
15 import gnu.trove.set.hash.THashSet;
16 import gnu.trove.strategy.HashingStrategy;
19 @SuppressWarnings({"rawtypes", "unchecked"})
22 public static List map(Function f, List l) {
23 ArrayList result = new ArrayList(l.size());
25 result.add(f.apply(a));
29 public static void iter(Function f, List l) {
34 public static List filter(Function p, List l) {
35 ArrayList result = new ArrayList(Math.min(10, l.size()));
37 if((Boolean)p.apply(a))
42 public static List filterJust(List l) {
43 ArrayList result = new ArrayList(Math.min(10, l.size()));
50 public static List reverse(List l) {
51 ArrayList result = new ArrayList(l.size());
52 for(int i=l.size()-1;i>=0;--i)
57 public static Object foldl(Function f, Object initial, List l) {
59 initial = f.apply(initial, a);
63 // (b -> Maybe (a, b)) -> b -> [a]
64 public static List unfoldr(Function f, Object state) {
65 ArrayList result = new ArrayList();
67 Object r = f.apply(state);
76 public static Object foldr(Function f, Object initial, List l) {
77 for(int i=l.size()-1;i>=0;--i)
78 initial = f.apply(initial, l.get(i));
82 public static Object foldl1(Function f, List l) {
83 Iterator it = l.iterator();
84 Object initial = it.next();
86 initial = f.apply(initial, it.next());
90 public static Object foldr1(Function f, List l) {
92 Object initial = l.get(i);
94 initial = f.apply(initial, l.get(i));
98 public static List _pp(List a, List b) {
99 ArrayList result = new ArrayList(a.size() + b.size());
105 public static List concat(List l) {
108 size += ((List)e).size();
109 ArrayList result = new ArrayList(size);
111 result.addAll((List)e);
115 public static List append(List a, List b) {
116 ArrayList result = new ArrayList(a.size() + b.size());
122 public static List concatMap(Function f, List l) {
123 return concat(map(f, l));
126 public static int length(List l) {
130 public static boolean forall(Function p, List l) {
132 if(!(Boolean)p.apply(e))
137 public static boolean exists(Function p, List l) {
139 if((Boolean)p.apply(e))
144 public static Object get(List l, double i) {
145 return l.get((int)i);
148 public static List build(Function f) {
149 return (List)f.apply(new ArrayList(),
150 new FunctionImpl2() {
152 public Object apply(Object p0, Object p1) {
159 public static List range(int from, int to) {
160 ArrayList result = new ArrayList();
168 public static List newList() {
169 return new ArrayList(2);
172 public static void add(List a, Object b) {
176 public static List zip(List a, List b) {
177 int len = Math.min(a.size(), b.size());
178 ArrayList result = new ArrayList(len);
179 for(int i=0;i<len;++i)
180 result.add(new Tuple2(a.get(i), b.get(i)));
184 public static List zipWith(Function f, List a, List b) {
185 int len = Math.min(a.size(), b.size());
186 ArrayList result = new ArrayList(len);
187 for(int i=0;i<len;++i)
188 result.add(f.apply(a.get(i), b.get(i)));
192 public static Tuple2 unzip(List in) {
194 ArrayList a = new ArrayList(len);
195 ArrayList b = new ArrayList(len);
196 for(int i=0;i<len;++i) {
197 Tuple2 tuple = (Tuple2)in.get(i);
201 return new Tuple2(a, b);
204 public static Function indexWith(final Function hash, final Function eq, List<Tuple2> l) {
205 final TCustomHashMap<Object,Object> map = new TCustomHashMap<Object,Object>(
206 new HashingStrategy<Object>() {
207 private static final long serialVersionUID = 3130052128660420673L;
210 public int computeHashCode(Object object) {
211 return (Integer)hash.apply(object);
215 public boolean equals(Object o1, Object o2) {
216 return (Boolean)eq.apply(o1, o2);
221 return new FunctionImpl1<Object,Object>() {
223 public Object apply(Object p0) {
229 // groupWith :: (a -> Integer) -> (a -> a -> Boolean) -> (a -> b) -> [a] -> [(b, [a])]
230 @SuppressWarnings("serial")
231 public static ArrayList<Tuple2> groupWith(final Function hash, final Function eq, Function keyFunction, Function valueFunction, List<Object> input) {
232 final TCustomHashMap<Object,ArrayList<Object>> map = new TCustomHashMap<Object,ArrayList<Object>>(
233 new HashingStrategy<Object>() {
235 public int computeHashCode(Object object) {
236 return (Integer)hash.apply(object);
240 public boolean equals(Object o1, Object o2) {
241 return (Boolean)eq.apply(o1, o2);
244 ArrayList<Tuple2> result = new ArrayList<Tuple2>();
245 for(Object o : input) {
246 Object key = keyFunction.apply(o);
247 ArrayList<Object> l = map.get(key);
249 l = new ArrayList<Object>();
251 result.add(new Tuple2(key, l));
253 l.add(valueFunction.apply(o));
258 public static List sortWith(final Function compare, List l) {
259 Object[] result = l.toArray(new Object[l.size()]);
260 Arrays.sort(result, new Comparator() {
262 public int compare(Object o1, Object o2) {
263 return (Integer)compare.apply(o1, o2);
266 return Arrays.asList(result);
269 public static List uniqueWith(Function compare, List l) {
270 ArrayList result = new ArrayList(Math.min(10, l.size()));
272 for(int i=0;i<l.size();++i) {
273 Object el = l.get(i);
274 for(int j=0;j<result.size();++j)
275 if(compare.apply(el, result.get(j)).equals(Boolean.TRUE))
282 public static List deleteAllBy(Function compare, List a, List b) {
283 ArrayList result = new ArrayList(Math.min(10, a.size()));
287 if(compare.apply(el, el2).equals(Boolean.TRUE))
294 public static List<Object> unique(List<Object> l) {
295 THashSet<Object> set = new THashSet<Object>();
298 return Arrays.asList(set.toArray(new Object[set.size()]));