Skip to content

Commit d078b58

Browse files
committed
Support for Maps and some primitive arrays
1 parent 042f003 commit d078b58

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

src/main/java/com/syntheticentropy/ocpro/builtin/OcproBuiltIn.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,29 @@
22

33
import com.ugos.jiprolog.engine.*;
44
import li.cil.oc.server.component.HandleValue;
5+
import scala.collection.JavaConverters;
56

7+
import java.util.Arrays;
8+
import java.util.Map;
9+
import java.util.Set;
610
import java.util.stream.Collectors;
711

812
public abstract class OcproBuiltIn extends BuiltIn {
913

14+
private ConsList entryToConsList(Map.Entry entry) {
15+
return ConsList.create(Arrays.asList(rawToPrologObject(entry.getKey()), rawToPrologObject(entry.getValue())));
16+
}
17+
private boolean isMap(Object o) {
18+
return o instanceof Map || o instanceof scala.collection.Map;
19+
}
20+
private Map<Object, Object> toMap(Object o) {
21+
if (o instanceof scala.collection.Map) {
22+
return (Map<Object, Object>) JavaConverters.mapAsJavaMapConverter((scala.collection.Map) o).asJava();
23+
}
24+
return (Map<Object, Object>) o;
25+
}
26+
27+
@SuppressWarnings("unchecked")
1028
public PrologObject rawToPrologObject(Object raw) {
1129
if (raw instanceof Boolean) {
1230
Boolean b = (Boolean) raw;
@@ -27,6 +45,20 @@ public PrologObject rawToPrologObject(Object raw) {
2745
if (raw instanceof HandleValue) {
2846
return Expression.createNumber(((HandleValue) raw).handle());
2947
}
48+
if (isMap(raw)) {
49+
Map<Object, Object> map = toMap(raw);
50+
return ConsList.create(map.entrySet().stream().map(this::entryToConsList).collect(Collectors.toList()));
51+
}
52+
if (raw instanceof Object[]) {
53+
Object[] objects = (Object[]) raw;
54+
return ConsList.create(Arrays.stream(objects).map(this::rawToPrologObject).collect(Collectors.toList()));
55+
}
56+
if (raw instanceof double[]) {
57+
return ConsList.create(Arrays.stream((double[]) raw).boxed().map(this::rawToPrologObject).collect(Collectors.toList()));
58+
}
59+
if (raw instanceof int[]) {
60+
return ConsList.create(Arrays.stream((int[]) raw).boxed().map(this::rawToPrologObject).collect(Collectors.toList()));
61+
}
3062
if (raw == null) {
3163
return Atom.createAtom("null");
3264
}

0 commit comments

Comments
 (0)