Skip to content

Commit a5a0219

Browse files
committed
Добавлена функция functional::chain
1 parent 7d05bf3 commit a5a0219

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/com/annimon/ownlang/lib/modules/functional.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public void init() {
1818
Functions.set("filter", new functional_filter());
1919
Functions.set("sortby", new functional_sortby());
2020

21+
Functions.set("chain", new functional_chain());
2122
Functions.set("combine", new functional_combine());
2223

2324
Variables.set("IDENTITY", new FunctionValue(args -> args[0]));
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.TypeException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class functional_chain implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
Arguments.checkAtLeast(2, args.length);
11+
12+
Value result = args[0];
13+
for (int i = 1; i < args.length; i += 2) {
14+
final Value arg = args[i];
15+
if (arg.type() != Types.FUNCTION) {
16+
throw new TypeException(arg.toString() + " is not a function");
17+
}
18+
final Function function = ((FunctionValue) arg).getValue();
19+
result = function.execute(result, args[i+1]);
20+
}
21+
return result;
22+
}
23+
24+
}

tests.own

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use "ounit"
2+
use "functional"
23

34
def testAdditionOnNumbers() {
45
assertEquals(6, 0 + 1 + 2 + 3)
@@ -56,4 +57,14 @@ def testFibonacci() {
5657
assertEquals(21, fib(8))
5758
}
5859

60+
def testFunctionalChain() {
61+
data = [1,2,3,4,5,6,7]
62+
result = chain(data,
63+
::filter, def(x) = x <= 4,
64+
::sortby, def(x) = -x,
65+
::map, def(x) = x * 2,
66+
)
67+
assertEquals([8,6,4,2], result)
68+
}
69+
5970
println runTests()

0 commit comments

Comments
 (0)