From 49ffa4f10907798185a36d4b79d758fe90b8b424 Mon Sep 17 00:00:00 2001 From: altrisi Date: Mon, 11 Jan 2021 19:46:39 +0100 Subject: [PATCH 1/2] Add new split functions --- .../script/language/DataStructures.java | 23 ++++++------------- .../java/carpet/script/value/ListValue.java | 18 +++++++++++++++ .../java/carpet/script/value/MapValue.java | 5 ++++ .../java/carpet/script/value/NullValue.java | 7 ++++++ src/main/java/carpet/script/value/Value.java | 15 ++++++++++++ 5 files changed, 52 insertions(+), 16 deletions(-) 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) 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 95df97c9..c810dc09 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; @@ -63,6 +65,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()); + } + @Override public JsonElement toJson() { diff --git a/src/main/java/carpet/script/value/Value.java b/src/main/java/carpet/script/value/Value.java index 8f79f462..b9ac965c 100644 --- a/src/main/java/carpet/script/value/Value.java +++ b/src/main/java/carpet/script/value/Value.java @@ -6,10 +6,12 @@ import com.google.gson.JsonPrimitive; import net.minecraft.nbt.Tag; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; +import java.util.stream.Collectors; public abstract class Value implements Comparable, Cloneable { @@ -188,6 +190,19 @@ public abstract class Value implements Comparable, Cloneable if (from > to) return StringValue.EMPTY; return new StringValue(value.substring(from, to)); } + + public Value split(Value delimiter) + { + try + { + return ListValue.wrap(Arrays.stream(getString().split(delimiter.getString())).map(StringValue::new).collect(Collectors.toList())); + } + catch (PatternSyntaxException pse) + { + throw new InternalExpressionException("Incorrect pattern for 'split': "+pse.getMessage()); + } + } + public double readDoubleNumber() { String s = getString(); From 0563590fe7b0fa4c184385b1d36191dfc747c3d5 Mon Sep 17 00:00:00 2001 From: altrisi Date: Mon, 11 Jan 2021 19:53:43 +0100 Subject: [PATCH 2/2] Document new split functions --- docs/scarpet/language/Containers.md | 8 ++++++++ 1 file changed, 8 insertions(+) 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?)`