diff --git a/docs/scarpet/language/Containers.md b/docs/scarpet/language/Containers.md index f017adaf..07d6993a 100644 --- a/docs/scarpet/language/Containers.md +++ b/docs/scarpet/language/Containers.md @@ -160,11 +160,19 @@ join('-', 'foo', 'bar') => foo-bar Splits a string under `expr` by `delim` which can be a regular expression. If no delimiter is specified, it splits by characters. +If `expr` is a list, it will split the list into multiple sublists by the element (s) which equal `delim`, or which equal the empty string +in case no delimiter is specified. + +Splitting a `null` value will return an empty list. +
split('foo') => [f, o, o]
split('','foo') => [f, o, o]
split('.','foo.bar') => []
split('\\.','foo.bar') => [foo, bar]
+split(1,[2,5,1,2,3,1,5,6]) => [[2,5],[2,3],[5,6]]
+split(1,[1,2,3,1,4,5,1] => [[], [2,3], [4,5], []]
+split(null) => []
### `slice(expr, from, to?)`
diff --git a/src/main/java/carpet/script/language/DataStructures.java b/src/main/java/carpet/script/language/DataStructures.java
index 95b18749..90d02d99 100644
--- a/src/main/java/carpet/script/language/DataStructures.java
+++ b/src/main/java/carpet/script/language/DataStructures.java
@@ -14,10 +14,8 @@ import carpet.script.value.StringValue;
import carpet.script.value.Value;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import java.util.regex.PatternSyntaxException;
import java.util.stream.Collectors;
public class DataStructures {
@@ -54,30 +52,23 @@ public class DataStructures {
expression.addFunction("split", (lv) ->
{
- String delimiter;
- String hwat;
+ Value delimiter;
+ Value hwat;
if (lv.size() == 1)
{
- hwat = lv.get(0).getString();
- delimiter = "";
+ hwat = lv.get(0);
+ delimiter = StringValue.EMPTY;
}
else if (lv.size() == 2)
{
- delimiter = lv.get(0).getString();
- hwat = lv.get(1).getString();
+ delimiter = lv.get(0);
+ hwat = lv.get(1);
}
else
{
throw new InternalExpressionException("'split' takes 1 or 2 arguments");
}
- try
- {
- return ListValue.wrap(Arrays.stream(hwat.split(delimiter)).map(StringValue::new).collect(Collectors.toList()));
- }
- catch (PatternSyntaxException pse)
- {
- throw new InternalExpressionException("Incorrect pattern for 'split': "+pse.getMessage());
- }
+ return hwat.split(delimiter);
});
expression.addFunction("slice", (lv) ->
diff --git a/src/main/java/carpet/script/value/ListValue.java b/src/main/java/carpet/script/value/ListValue.java
index a036af56..c3b23438 100644
--- a/src/main/java/carpet/script/value/ListValue.java
+++ b/src/main/java/carpet/script/value/ListValue.java
@@ -347,6 +347,24 @@ public class ListValue extends AbstractListValue implements ContainerValueInterf
return new ListValue((Collection extends Value>) getItems().subList(from, to));
}
+ @Override
+ public Value split(Value delimiter) {
+ ListValue result = new ListValue();
+ int startIndex = 0;
+ int index = 0;
+ for (Value val : this.items)
+ {
+ index++;
+ if (val.equals(delimiter))
+ {
+ result.items.add(ListValue.wrap(this.items.subList(startIndex, index-1)));
+ startIndex = index;
+ }
+ }
+ result.items.add(ListValue.wrap(this.items.subList(startIndex, length())));
+ return result;
+ }
+
@Override
public double readDoubleNumber()
{
diff --git a/src/main/java/carpet/script/value/MapValue.java b/src/main/java/carpet/script/value/MapValue.java
index abefe087..81375bdc 100644
--- a/src/main/java/carpet/script/value/MapValue.java
+++ b/src/main/java/carpet/script/value/MapValue.java
@@ -203,6 +203,11 @@ public class MapValue extends AbstractListValue implements ContainerValueInterfa
throw new InternalExpressionException("Cannot slice a map value");
}
+ @Override
+ public Value split(Value delimiter) {
+ throw new InternalExpressionException("Cannot split a map value");
+ }
+
@Override
public double readDoubleNumber()
{
diff --git a/src/main/java/carpet/script/value/NullValue.java b/src/main/java/carpet/script/value/NullValue.java
index 48bb5d2e..e2a1f3a7 100644
--- a/src/main/java/carpet/script/value/NullValue.java
+++ b/src/main/java/carpet/script/value/NullValue.java
@@ -1,5 +1,7 @@
package carpet.script.value;
+import java.util.ArrayList;
+
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import net.minecraft.nbt.StringTag;
@@ -68,6 +70,11 @@ public class NullValue extends NumericValue // TODO check nonsingleton code
return StringTag.of("null");
}
+ @Override
+ public Value split(Value delimiter) {
+ return ListValue.wrap(new ArrayList