Skip to content

Commit 4185fd5

Browse files
committed
Добавлены функции joinToString для массива и joining для stream
1 parent f46ed63 commit 4185fd5

File tree

6 files changed

+57
-25
lines changed

6 files changed

+57
-25
lines changed

examples/forms/textarea.own

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use ["std", "forms", "functional"]
22

3-
text = join(map(range(1, 16), def(x) = "line " + x), "\n")
3+
text = map(range(1, 16), def(x) = "line " + x).joinToString("\n")
44
label = newLabel()
55
textArea = newTextArea(text)
66
textArea.addCaretListener(def(event) = updateInfo())

src/main/java/com/annimon/ownlang/lib/ArrayValue.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.annimon.ownlang.lib;
22

3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
34
import com.annimon.ownlang.exceptions.TypeException;
45
import java.util.Arrays;
56
import java.util.Iterator;
@@ -48,6 +49,17 @@ public static ArrayValue merge(ArrayValue array1, ArrayValue array2) {
4849
return result;
4950
}
5051

52+
public static StringValue joinToString(ArrayValue array, String delimiter, String prefix, String suffix) {
53+
final StringBuilder sb = new StringBuilder();
54+
for (Value value : array) {
55+
if (sb.length() > 0) sb.append(delimiter);
56+
else sb.append(prefix);
57+
sb.append(value.asString());
58+
}
59+
sb.append(suffix);
60+
return new StringValue(sb.toString());
61+
}
62+
5163
private final Value[] elements;
5264

5365
public ArrayValue(int size) {
@@ -96,12 +108,30 @@ public Value get(Value index) {
96108

97109
// Functions
98110
case "isEmpty":
99-
return NumberValue.fromBoolean(size() == 0);
111+
return Converters.voidToBoolean(() -> size() == 0);
112+
case "joinToString":
113+
return new FunctionValue(this::joinToString);
100114

101115
default:
102116
return get(index.asInt());
103117
}
104118
}
119+
120+
public Value joinToString(Value[] args) {
121+
Arguments.checkRange(0, 3, args.length);
122+
switch (args.length) {
123+
case 0:
124+
return joinToString(this, "", "", "");
125+
case 1:
126+
return joinToString(this, args[0].asString(), "", "");
127+
case 2:
128+
return joinToString(this, args[0].asString(), args[1].asString(), args[1].asString());
129+
case 3:
130+
return joinToString(this, args[0].asString(), args[1].asString(), args[2].asString());
131+
default:
132+
throw new ArgumentsMismatchException("Wrong number of arguments");
133+
}
134+
}
105135

106136
public void set(int index, Value value) {
107137
elements[index] = value;

src/main/java/com/annimon/ownlang/modules/functional/functional_stream.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
public final class functional_stream implements Function {
99

1010
@Override
11-
public Value execute(Value... args) {
11+
public Value execute(Value[] args) {
1212
Arguments.checkAtLeast(1, args.length);
1313

1414
if (args.length > 1) {
@@ -52,10 +52,11 @@ private void init() {
5252
set("reduce", wrapTerminal(new functional_reduce()));
5353
set("forEach", wrapTerminal(new functional_foreach()));
5454
set("toArray", args -> container);
55+
set("joining", container::joinToString);
5556
set("count", args -> NumberValue.of(container.size()));
5657
}
5758

58-
private Value skip(Value... args) {
59+
private Value skip(Value[] args) {
5960
Arguments.check(1, args.length);
6061

6162
final int skipCount = args[0].asInt();
@@ -71,7 +72,7 @@ private Value skip(Value... args) {
7172
return new StreamValue(new ArrayValue(result));
7273
}
7374

74-
private Value limit(Value... args) {
75+
private Value limit(Value[] args) {
7576
Arguments.check(1, args.length);
7677

7778
final int limitCount = args[0].asInt();
@@ -87,7 +88,7 @@ private Value limit(Value... args) {
8788
return new StreamValue(new ArrayValue(result));
8889
}
8990

90-
private Value sorted(Value... args) {
91+
private Value sorted(Value[] args) {
9192
Arguments.checkOrOr(0, 1, args.length);
9293
final Value[] elements = container.getCopyElements();
9394

@@ -106,7 +107,7 @@ private Value sorted(Value... args) {
106107
return new StreamValue(new ArrayValue(elements));
107108
}
108109

109-
private Value custom(Value... args) {
110+
private Value custom(Value[] args) {
110111
Arguments.check(1, args.length);
111112
final Function f = ValueUtils.consumeFunction(args[0], 0);
112113
final Value result = f.execute(container);
@@ -115,7 +116,7 @@ private Value custom(Value... args) {
115116
}
116117
return result;
117118
}
118-
119+
119120
private FunctionValue wrapIntermediate(Function f) {
120121
return wrap(f, true);
121122
}

src/main/java/com/annimon/ownlang/modules/std/std_join.java

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import com.annimon.ownlang.lib.Arguments;
66
import com.annimon.ownlang.lib.ArrayValue;
77
import com.annimon.ownlang.lib.Function;
8-
import com.annimon.ownlang.lib.StringValue;
98
import com.annimon.ownlang.lib.Types;
109
import com.annimon.ownlang.lib.Value;
1110

@@ -21,26 +20,15 @@ public Value execute(Value... args) {
2120
final ArrayValue array = (ArrayValue) args[0];
2221
switch (args.length) {
2322
case 1:
24-
return join(array, "", "", "");
23+
return ArrayValue.joinToString(array, "", "", "");
2524
case 2:
26-
return join(array, args[1].asString(), "", "");
25+
return ArrayValue.joinToString(array, args[1].asString(), "", "");
2726
case 3:
28-
return join(array, args[1].asString(), args[2].asString(), args[2].asString());
27+
return ArrayValue.joinToString(array, args[1].asString(), args[2].asString(), args[2].asString());
2928
case 4:
30-
return join(array, args[1].asString(), args[2].asString(), args[3].asString());
29+
return ArrayValue.joinToString(array, args[1].asString(), args[2].asString(), args[3].asString());
3130
default:
3231
throw new ArgumentsMismatchException("Wrong number of arguments");
3332
}
3433
}
35-
36-
private static StringValue join(ArrayValue array, String delimiter, String prefix, String suffix) {
37-
final StringBuilder sb = new StringBuilder();
38-
for (Value value : array) {
39-
if (sb.length() > 0) sb.append(delimiter);
40-
else sb.append(prefix);
41-
sb.append(value.asString());
42-
}
43-
sb.append(suffix);
44-
return new StringValue(sb.toString());
45-
}
4634
}

src/test/resources/modules/functional/stream.own

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ def testCustom() {
4343
assertEquals([5,6,4,2], stream(data).custom(::reverse).toArray())
4444
}
4545

46+
def testJoining() {
47+
data = [1,2,3,4]
48+
assertEquals("1234", stream(data).joining())
49+
assertEquals("1-2-3-4", stream(data).joining("-"))
50+
assertEquals("<1-2-3-4>", stream(data).joining("-", "<", ">"))
51+
}
52+
4653
def testPeek() {
4754
data = [2,3,4,5,6,7]
4855
expected = [2,4,6]

src/test/resources/other/arrayFunctions.own

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,11 @@ def testGetLengthInnerArray() {
2222

2323
def testIsEmpty() {
2424
arr = [1, 2, 3]
25-
assertFalse(arr.isEmpty)
25+
assertFalse(arr.isEmpty())
26+
}
27+
28+
def testJoinToString() {
29+
arr = [1, 2, 3]
30+
assertEquals("123", arr.joinToString())
31+
assertEquals("1 2 3", arr.joinToString(" "))
2632
}

0 commit comments

Comments
 (0)