Добавлены функции joinToString для массива и joining для stream

This commit is contained in:
Victor 2019-10-08 22:24:31 +03:00
parent f46ed638bf
commit 4185fd5baa
6 changed files with 57 additions and 25 deletions

View File

@ -1,6 +1,6 @@
use ["std", "forms", "functional"] use ["std", "forms", "functional"]
text = join(map(range(1, 16), def(x) = "line " + x), "\n") text = map(range(1, 16), def(x) = "line " + x).joinToString("\n")
label = newLabel() label = newLabel()
textArea = newTextArea(text) textArea = newTextArea(text)
textArea.addCaretListener(def(event) = updateInfo()) textArea.addCaretListener(def(event) = updateInfo())

View File

@ -1,5 +1,6 @@
package com.annimon.ownlang.lib; package com.annimon.ownlang.lib;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.exceptions.TypeException; import com.annimon.ownlang.exceptions.TypeException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
@ -48,6 +49,17 @@ public class ArrayValue implements Value, Iterable<Value> {
return result; return result;
} }
public static StringValue joinToString(ArrayValue array, String delimiter, String prefix, String suffix) {
final StringBuilder sb = new StringBuilder();
for (Value value : array) {
if (sb.length() > 0) sb.append(delimiter);
else sb.append(prefix);
sb.append(value.asString());
}
sb.append(suffix);
return new StringValue(sb.toString());
}
private final Value[] elements; private final Value[] elements;
public ArrayValue(int size) { public ArrayValue(int size) {
@ -96,13 +108,31 @@ public class ArrayValue implements Value, Iterable<Value> {
// Functions // Functions
case "isEmpty": case "isEmpty":
return NumberValue.fromBoolean(size() == 0); return Converters.voidToBoolean(() -> size() == 0);
case "joinToString":
return new FunctionValue(this::joinToString);
default: default:
return get(index.asInt()); return get(index.asInt());
} }
} }
public Value joinToString(Value[] args) {
Arguments.checkRange(0, 3, args.length);
switch (args.length) {
case 0:
return joinToString(this, "", "", "");
case 1:
return joinToString(this, args[0].asString(), "", "");
case 2:
return joinToString(this, args[0].asString(), args[1].asString(), args[1].asString());
case 3:
return joinToString(this, args[0].asString(), args[1].asString(), args[2].asString());
default:
throw new ArgumentsMismatchException("Wrong number of arguments");
}
}
public void set(int index, Value value) { public void set(int index, Value value) {
elements[index] = value; elements[index] = value;
} }

View File

@ -8,7 +8,7 @@ import java.util.Arrays;
public final class functional_stream implements Function { public final class functional_stream implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value[] args) {
Arguments.checkAtLeast(1, args.length); Arguments.checkAtLeast(1, args.length);
if (args.length > 1) { if (args.length > 1) {
@ -52,10 +52,11 @@ public final class functional_stream implements Function {
set("reduce", wrapTerminal(new functional_reduce())); set("reduce", wrapTerminal(new functional_reduce()));
set("forEach", wrapTerminal(new functional_foreach())); set("forEach", wrapTerminal(new functional_foreach()));
set("toArray", args -> container); set("toArray", args -> container);
set("joining", container::joinToString);
set("count", args -> NumberValue.of(container.size())); set("count", args -> NumberValue.of(container.size()));
} }
private Value skip(Value... args) { private Value skip(Value[] args) {
Arguments.check(1, args.length); Arguments.check(1, args.length);
final int skipCount = args[0].asInt(); final int skipCount = args[0].asInt();
@ -71,7 +72,7 @@ public final class functional_stream implements Function {
return new StreamValue(new ArrayValue(result)); return new StreamValue(new ArrayValue(result));
} }
private Value limit(Value... args) { private Value limit(Value[] args) {
Arguments.check(1, args.length); Arguments.check(1, args.length);
final int limitCount = args[0].asInt(); final int limitCount = args[0].asInt();
@ -87,7 +88,7 @@ public final class functional_stream implements Function {
return new StreamValue(new ArrayValue(result)); return new StreamValue(new ArrayValue(result));
} }
private Value sorted(Value... args) { private Value sorted(Value[] args) {
Arguments.checkOrOr(0, 1, args.length); Arguments.checkOrOr(0, 1, args.length);
final Value[] elements = container.getCopyElements(); final Value[] elements = container.getCopyElements();
@ -106,7 +107,7 @@ public final class functional_stream implements Function {
return new StreamValue(new ArrayValue(elements)); return new StreamValue(new ArrayValue(elements));
} }
private Value custom(Value... args) { private Value custom(Value[] args) {
Arguments.check(1, args.length); Arguments.check(1, args.length);
final Function f = ValueUtils.consumeFunction(args[0], 0); final Function f = ValueUtils.consumeFunction(args[0], 0);
final Value result = f.execute(container); final Value result = f.execute(container);

View File

@ -5,7 +5,6 @@ import com.annimon.ownlang.exceptions.TypeException;
import com.annimon.ownlang.lib.Arguments; import com.annimon.ownlang.lib.Arguments;
import com.annimon.ownlang.lib.ArrayValue; import com.annimon.ownlang.lib.ArrayValue;
import com.annimon.ownlang.lib.Function; import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.StringValue;
import com.annimon.ownlang.lib.Types; import com.annimon.ownlang.lib.Types;
import com.annimon.ownlang.lib.Value; import com.annimon.ownlang.lib.Value;
@ -21,26 +20,15 @@ public final class std_join implements Function {
final ArrayValue array = (ArrayValue) args[0]; final ArrayValue array = (ArrayValue) args[0];
switch (args.length) { switch (args.length) {
case 1: case 1:
return join(array, "", "", ""); return ArrayValue.joinToString(array, "", "", "");
case 2: case 2:
return join(array, args[1].asString(), "", ""); return ArrayValue.joinToString(array, args[1].asString(), "", "");
case 3: case 3:
return join(array, args[1].asString(), args[2].asString(), args[2].asString()); return ArrayValue.joinToString(array, args[1].asString(), args[2].asString(), args[2].asString());
case 4: case 4:
return join(array, args[1].asString(), args[2].asString(), args[3].asString()); return ArrayValue.joinToString(array, args[1].asString(), args[2].asString(), args[3].asString());
default: default:
throw new ArgumentsMismatchException("Wrong number of arguments"); throw new ArgumentsMismatchException("Wrong number of arguments");
} }
} }
private static StringValue join(ArrayValue array, String delimiter, String prefix, String suffix) {
final StringBuilder sb = new StringBuilder();
for (Value value : array) {
if (sb.length() > 0) sb.append(delimiter);
else sb.append(prefix);
sb.append(value.asString());
}
sb.append(suffix);
return new StringValue(sb.toString());
}
} }

View File

@ -43,6 +43,13 @@ def testCustom() {
assertEquals([5,6,4,2], stream(data).custom(::reverse).toArray()) assertEquals([5,6,4,2], stream(data).custom(::reverse).toArray())
} }
def testJoining() {
data = [1,2,3,4]
assertEquals("1234", stream(data).joining())
assertEquals("1-2-3-4", stream(data).joining("-"))
assertEquals("<1-2-3-4>", stream(data).joining("-", "<", ">"))
}
def testPeek() { def testPeek() {
data = [2,3,4,5,6,7] data = [2,3,4,5,6,7]
expected = [2,4,6] expected = [2,4,6]

View File

@ -22,5 +22,11 @@ def testGetLengthInnerArray() {
def testIsEmpty() { def testIsEmpty() {
arr = [1, 2, 3] arr = [1, 2, 3]
assertFalse(arr.isEmpty) assertFalse(arr.isEmpty())
}
def testJoinToString() {
arr = [1, 2, 3]
assertEquals("123", arr.joinToString())
assertEquals("1 2 3", arr.joinToString(" "))
} }