mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Добавлены функции joinToString для массива и joining для stream
This commit is contained in:
parent
f46ed638bf
commit
4185fd5baa
@ -1,6 +1,6 @@
|
||||
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()
|
||||
textArea = newTextArea(text)
|
||||
textArea.addCaretListener(def(event) = updateInfo())
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.annimon.ownlang.lib;
|
||||
|
||||
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
|
||||
import com.annimon.ownlang.exceptions.TypeException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Iterator;
|
||||
@ -48,6 +49,17 @@ public class ArrayValue implements Value, Iterable<Value> {
|
||||
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;
|
||||
|
||||
public ArrayValue(int size) {
|
||||
@ -96,13 +108,31 @@ public class ArrayValue implements Value, Iterable<Value> {
|
||||
|
||||
// Functions
|
||||
case "isEmpty":
|
||||
return NumberValue.fromBoolean(size() == 0);
|
||||
return Converters.voidToBoolean(() -> size() == 0);
|
||||
case "joinToString":
|
||||
return new FunctionValue(this::joinToString);
|
||||
|
||||
default:
|
||||
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) {
|
||||
elements[index] = value;
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ import java.util.Arrays;
|
||||
public final class functional_stream implements Function {
|
||||
|
||||
@Override
|
||||
public Value execute(Value... args) {
|
||||
public Value execute(Value[] args) {
|
||||
Arguments.checkAtLeast(1, args.length);
|
||||
|
||||
if (args.length > 1) {
|
||||
@ -52,10 +52,11 @@ public final class functional_stream implements Function {
|
||||
set("reduce", wrapTerminal(new functional_reduce()));
|
||||
set("forEach", wrapTerminal(new functional_foreach()));
|
||||
set("toArray", args -> container);
|
||||
set("joining", container::joinToString);
|
||||
set("count", args -> NumberValue.of(container.size()));
|
||||
}
|
||||
|
||||
private Value skip(Value... args) {
|
||||
private Value skip(Value[] args) {
|
||||
Arguments.check(1, args.length);
|
||||
|
||||
final int skipCount = args[0].asInt();
|
||||
@ -71,7 +72,7 @@ public final class functional_stream implements Function {
|
||||
return new StreamValue(new ArrayValue(result));
|
||||
}
|
||||
|
||||
private Value limit(Value... args) {
|
||||
private Value limit(Value[] args) {
|
||||
Arguments.check(1, args.length);
|
||||
|
||||
final int limitCount = args[0].asInt();
|
||||
@ -87,7 +88,7 @@ public final class functional_stream implements Function {
|
||||
return new StreamValue(new ArrayValue(result));
|
||||
}
|
||||
|
||||
private Value sorted(Value... args) {
|
||||
private Value sorted(Value[] args) {
|
||||
Arguments.checkOrOr(0, 1, args.length);
|
||||
final Value[] elements = container.getCopyElements();
|
||||
|
||||
@ -106,7 +107,7 @@ public final class functional_stream implements Function {
|
||||
return new StreamValue(new ArrayValue(elements));
|
||||
}
|
||||
|
||||
private Value custom(Value... args) {
|
||||
private Value custom(Value[] args) {
|
||||
Arguments.check(1, args.length);
|
||||
final Function f = ValueUtils.consumeFunction(args[0], 0);
|
||||
final Value result = f.execute(container);
|
||||
|
@ -5,7 +5,6 @@ import com.annimon.ownlang.exceptions.TypeException;
|
||||
import com.annimon.ownlang.lib.Arguments;
|
||||
import com.annimon.ownlang.lib.ArrayValue;
|
||||
import com.annimon.ownlang.lib.Function;
|
||||
import com.annimon.ownlang.lib.StringValue;
|
||||
import com.annimon.ownlang.lib.Types;
|
||||
import com.annimon.ownlang.lib.Value;
|
||||
|
||||
@ -21,26 +20,15 @@ public final class std_join implements Function {
|
||||
final ArrayValue array = (ArrayValue) args[0];
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
return join(array, "", "", "");
|
||||
return ArrayValue.joinToString(array, "", "", "");
|
||||
case 2:
|
||||
return join(array, args[1].asString(), "", "");
|
||||
return ArrayValue.joinToString(array, args[1].asString(), "", "");
|
||||
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:
|
||||
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:
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
@ -43,6 +43,13 @@ def testCustom() {
|
||||
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() {
|
||||
data = [2,3,4,5,6,7]
|
||||
expected = [2,4,6]
|
||||
|
@ -22,5 +22,11 @@ def testGetLengthInnerArray() {
|
||||
|
||||
def testIsEmpty() {
|
||||
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(" "))
|
||||
}
|
Loading…
Reference in New Issue
Block a user