Добавлена функция custom в StreamValue

This commit is contained in:
Victor 2016-08-01 15:01:59 +03:00
parent de07d86dd3
commit 909691dc1a
2 changed files with 30 additions and 1 deletions

View File

@ -29,7 +29,7 @@ public final class functional_stream implements Function {
private final ArrayValue container; private final ArrayValue container;
public StreamValue(ArrayValue container) { public StreamValue(ArrayValue container) {
super(12); super(13);
this.container = container; this.container = container;
init(); init();
} }
@ -43,6 +43,7 @@ public final class functional_stream implements Function {
set("dropWhile", wrapIntermediate(new functional_dropwhile())); set("dropWhile", wrapIntermediate(new functional_dropwhile()));
set("skip", this::skip); set("skip", this::skip);
set("limit", this::limit); set("limit", this::limit);
set("custom", this::custom);
set("reduce", wrapTerminal(new functional_reduce())); set("reduce", wrapTerminal(new functional_reduce()));
set("forEach", wrapTerminal(new functional_foreach())); set("forEach", wrapTerminal(new functional_foreach()));
@ -82,6 +83,19 @@ public final class functional_stream implements Function {
return new StreamValue(new ArrayValue(result)); return new StreamValue(new ArrayValue(result));
} }
private Value custom(Value... args) {
Arguments.check(1, args.length);
if (args[0].type() != Types.FUNCTION) {
throw new TypeException("Function expected in first argument");
}
final Function f = ((FunctionValue) args[0]).getValue();
final Value result = f.execute(container);
if (result.type() == Types.ARRAY) {
return new StreamValue((ArrayValue) result);
}
return result;
}
private FunctionValue wrapIntermediate(Function f) { private FunctionValue wrapIntermediate(Function f) {
return wrap(f, true); return wrap(f, true);
} }

View File

@ -1,3 +1,4 @@
use "std"
use "functional" use "functional"
def testStream() { def testStream() {
@ -37,3 +38,17 @@ def testDropWhile() {
assertEquals([5, 6, 7, 8], stream(data).dropWhile(def(x) = x % 2 == 0).toArray()) assertEquals([5, 6, 7, 8], stream(data).dropWhile(def(x) = x % 2 == 0).toArray())
assertEquals(data, stream(data).dropWhile(def(x) = x % 2 != 0).toArray()) assertEquals(data, stream(data).dropWhile(def(x) = x % 2 != 0).toArray())
} }
def testCustom() {
data = [2,4,6,5]
assertEquals([5,6,4,2], stream(data).custom(::reverse).toArray())
}
def reverse(container) {
size = length(container)
result = newarray(size)
for i : range(size) {
result[size - i - 1] = container[i]
}
return result
}