Skip to content

Commit 5a533cc

Browse files
committed
[functional] Add tomap, Stream::toMap, Stream::anyMatch, Stream::allMatch, Stream::noneMatch
1 parent 8ca3672 commit 5a533cc

22 files changed

+237
-14
lines changed

docs/src/modules/functional.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,17 @@ functions:
128128
]
129129
println groupby(data, def(e) = e.k1) // {"2"=[{k1=2, k2=x}], "4"=[{k1=4, k2=z}], "5"=[{k2=p, k1=5}]}
130130
println groupby(data, def(e) = e.k2) // {"x"=[{k1=2, k2=x}], "z"=[{k1=4, k2=z}], "p"=[{k2=p, k1=5}]}
131+
- name: tomap
132+
args: "data, keyMapper, valueMapper = def(v) = v, merger = def(oldValue, newValue) = newValue"
133+
desc: "converts elements of an array or a map to a map based on `keyMapper` and `valueMapper` functions result. `merger` function resolves collisions"
134+
desc_ru: "преобразует элементы массива или объекта в объект, основываясь на результате функций `keyMapper` и `valueMapper`. Функция `merger` используется для разрешения коллизий"
135+
since: 2.0.0
136+
example: |-
137+
use functional
138+
139+
data = ["apple", "banana"]
140+
println tomap(data, def(str) = str.substring(0, 1)) // {"a": "apple", "b": "banana"}
141+
println tomap(data, def(str) = str.substring(0, 1), ::toUpperCase) // {"a": "APPLE", "b": "BANANA"}
131142
- name: stream
132143
args: data
133144
desc: creates stream from data and returns `StreamValue`
@@ -229,6 +240,26 @@ types:
229240
args: ""
230241
desc: returns array of elements
231242
desc_ru: возвращает массив элементов
243+
- name: toMap
244+
args: "keyMapper, valueMapper = def(v) = v, merger = def(oldValue, newValue) = newValue"
245+
desc: "converts elements to a map based on `keyMapper` and `valueMapper` functions result. `merger` function resolves collisions"
246+
desc_ru: "преобразует элементы в объект, основываясь на результате функций `keyMapper` и `valueMapper`. Функция `merger` используется для разрешения коллизий"
247+
since: 2.0.0
248+
- name: anyMatch
249+
args: predicate
250+
desc: "returns `true` if there is any element matching the given `predicate`, otherwise returns `false`"
251+
desc_ru: "возвращает `true`, если хотя бы один элемент удовлетворяет функции `predicate`, иначе возвращает `false`"
252+
since: 2.0.0
253+
- name: allMatch
254+
args: predicate
255+
desc: "returns `true` if all elements match the given `predicate`, otherwise returns `false`"
256+
desc_ru: "возвращает `true`, если все элементы удовлетворяют функции `predicate`, иначе возвращает `false`"
257+
since: 2.0.0
258+
- name: noneMatch
259+
args: predicate
260+
desc: "returns `true` if no elements match the given `predicate`, otherwise returns `false`"
261+
desc_ru: "возвращает `true`, если нет элементов, удовлетворяющих функции `predicate`, иначе возвращает `false`"
262+
since: 2.0.0
232263
- name: count
233264
args: ""
234265
desc: returns the elements count

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
44
import com.annimon.ownlang.lib.*;
5+
import com.annimon.ownlang.modules.functional.functional_match.MatchType;
56
import java.util.Arrays;
67

78
class StreamValue extends MapValue {
@@ -33,6 +34,10 @@ private void init() {
3334
set("forEachIndexed", wrapTerminal(new functional_forEachIndexed()));
3435
set("groupBy", wrapTerminal(new functional_groupBy()));
3536
set("toArray", args -> container);
37+
set("toMap", wrapTerminal(new functional_toMap()));
38+
set("anyMatch", wrapTerminal(functional_match.match(MatchType.ANY)));
39+
set("allMatch", wrapTerminal(functional_match.match(MatchType.ALL)));
40+
set("noneMatch", wrapTerminal(functional_match.match(MatchType.NONE)));
3641
set("joining", container::joinToString);
3742
set("count", args -> NumberValue.of(container.size()));
3843
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public Map<String, Function> functions() {
2828
result.put("takewhile", new functional_takeWhile());
2929
result.put("dropwhile", new functional_dropWhile());
3030
result.put("groupby", new functional_groupBy());
31+
result.put("tomap", new functional_toMap());
3132

3233
result.put("chain", new functional_chain());
3334
result.put("stream", new functional_stream());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.annimon.ownlang.lib.Value;
66
import com.annimon.ownlang.lib.ValueUtils;
77

8-
public final class functional_chain implements Function {
8+
final class functional_chain implements Function {
99

1010
@Override
1111
public Value execute(Value[] args) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.annimon.ownlang.lib.Types;
88
import com.annimon.ownlang.lib.Value;
99

10-
public final class functional_combine implements Function {
10+
final class functional_combine implements Function {
1111

1212
@Override
1313
public Value execute(Value[] args) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.annimon.ownlang.lib.Value;
1010
import com.annimon.ownlang.lib.ValueUtils;
1111

12-
public final class functional_dropWhile implements Function {
12+
final class functional_dropWhile implements Function {
1313

1414
@Override
1515
public Value execute(Value[] args) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import java.util.List;
77
import java.util.Map;
88

9-
public final class functional_filter implements Function {
9+
final class functional_filter implements Function {
1010

1111
@Override
1212
public Value execute(Value[] args) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.annimon.ownlang.lib.*;
44

5-
public final class functional_filterNot implements Function {
5+
final class functional_filterNot implements Function {
66

77
@Override
88
public Value execute(Value[] args) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.util.ArrayList;
1111
import java.util.List;
1212

13-
public final class functional_flatmap implements Function {
13+
final class functional_flatmap implements Function {
1414

1515
@Override
1616
public Value execute(Value[] args) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import com.annimon.ownlang.lib.*;
55
import java.util.Map;
66

7-
public final class functional_forEach implements Function {
7+
final class functional_forEach implements Function {
88

99
@Override
1010
public Value execute(Value[] args) {

0 commit comments

Comments
 (0)