package abs.fli.java;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import ABS.StdLib.List;
import ABS.StdLib.List_Cons;
import ABS.StdLib.List_Nil;
import ABS.StdLib.Map;
import ABS.StdLib.Map_EmptyMap;
import ABS.StdLib.Map_InsertAssoc;
import ABS.StdLib.Pair_Pair;
import ABS.StdLib.Set;
import ABS.StdLib.Set_EmptySet;
import ABS.StdLib.Set_Insert;
import ABS.StdLib.reverse_f;
import abs.backend.java.lib.types.ABSValue;
/**
*
* @author pwong
*
*/
public class CollectionUtil {
public <A extends ABSValue,B> java.util.List<B> convert(Fun<A,B> f, List<A> absList) {
java.util.List<B> list = new ArrayList<B>();
while (absList.isCons()) {
List_Cons<A> cons = absList.toCons();
list.add(f.evaluate(cons.getArg0()));
absList = cons.getArg1();
}
return list;
}
public <A extends ABSValue,B> List<A> convert(Fun<B,A> f, java.util.List<B> List) {
List<A> abslist = new List_Nil<A>();
for (B v : List) {
abslist = new List_Cons<A>(f.evaluate(v), abslist);
}
return reverse_f.apply(abslist);
}
public <A extends ABSValue,B> java.util.Set<B> convert(Fun<A,B> f, Set<A> absSet) {
java.util.Set<B> set = new HashSet<B>();
while (absSet.isInsert()) {
Set_Insert<A> insert = absSet.toInsert();
set.add(f.evaluate(insert.getArg0()));
absSet = insert.getArg1();
}
return set;
}
public <A extends ABSValue,B> Set<A> convert(Fun<B,A> f, java.util.Set<B> set) {
Set<A> absSet = new Set_EmptySet<A>();
for (B v : set) {
absSet = new Set_Insert<A>(f.evaluate(v), absSet);
}
return absSet;
}
public <A extends ABSValue,B,C extends ABSValue,D> java.util.Map<B, D> convert(Fun<A,B> f, Fun<C,D> g, Map<A, C> absMap) {
java.util.Map<B, D> map = new HashMap<B, D>();
while (absMap.isInsertAssoc()) {
Map_InsertAssoc<A, C> insert = absMap.toInsertAssoc();
Pair_Pair<A, C> pair = insert.getArg0().toPair();
map.put(f.evaluate(pair.getArg0()), g.evaluate(pair.getArg1()));
absMap = insert.getArg1();
}
return map;
}
public <A extends ABSValue,B,C extends ABSValue,D> Map<A, C> convert(Fun<B,A> f, Fun<D,C> g, java.util.Map<B, D> map) {
Map<A, C> absMap = new Map_EmptyMap<A, C>();
for (B v : map.keySet()) {
absMap = new Map_InsertAssoc<A, C>(
new Pair_Pair<A, C>(f.evaluate(v), g.evaluate(map.get(v))),
absMap);
}
return absMap;
}
public <A extends ABSValue> java.util.List<A> convert(List<A> absList) {
java.util.List<A> list = new ArrayList<A>();
while (absList.isCons()) {
List_Cons<A> cons = absList.toCons();
list.add(cons.getArg0());
absList = cons.getArg1();
}
return list;
}
public <A extends ABSValue> List<A> convert(java.util.List<A> List) {
List<A> abslist = new List_Nil<A>();
for (A v : List) {
abslist = new List_Cons<A>(v, abslist);
}
return reverse_f.apply(abslist);
}
public <A extends ABSValue> java.util.Set<A> convert(Set<A> absSet) {
java.util.Set<A> set = new HashSet<A>();
while (absSet.isInsert()) {
Set_Insert<A> insert = absSet.toInsert();
set.add(insert.getArg0());
absSet = insert.getArg1();
}
return set;
}
public <A extends ABSValue> Set<A> convert(java.util.Set<A> set) {
Set<A> absSet = new Set_EmptySet<A>();
for (A v : set) {
absSet = new Set_Insert<A>(v, absSet);
}
return absSet;
}
public <A extends ABSValue,B extends ABSValue> java.util.Map<A, B> convert(Map<A, B> absMap) {
java.util.Map<A, B> map = new HashMap<A, B>();
if (absMap.isInsertAssoc()) {
Map_InsertAssoc<A, B> insert = absMap.toInsertAssoc();
Pair_Pair<A, B> pair = insert.getArg0().toPair();
map.put(pair.getArg0(), pair.getArg1());
map.putAll(convert(insert.getArg1()));
}
return map;
}
public <A extends ABSValue,B extends ABSValue> Map<A, B> convert(java.util.Map<A, B> map) {
Map<A, B> absMap = new Map_EmptyMap<A, B>();
for (A v : map.keySet()) {
absMap = new Map_InsertAssoc<A, B>(
new Pair_Pair<A, B>(v, map.get(v)),
absMap);
}
return absMap;
}
}