mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Добавлены функции joinToString для массива и joining для stream
This commit is contained in:
parent
f46ed638bf
commit
4185fd5baa
@ -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())
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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]
|
||||||
|
@ -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(" "))
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user