Skip to content

Commit ef701c9

Browse files
committed
Функции для работы с массивами
1 parent 1e33fa3 commit ef701c9

File tree

5 files changed

+109
-2
lines changed

5 files changed

+109
-2
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.exceptions.TypeException;
5+
import com.annimon.ownlang.lib.*;
6+
7+
public final class std_arrayCombine implements Function {
8+
9+
@Override
10+
public Value execute(Value... args) {
11+
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected");
12+
if (args[0].type() != Types.ARRAY) {
13+
throw new TypeException("Array expected in first argument");
14+
}
15+
if (args[1].type() != Types.ARRAY) {
16+
throw new TypeException("Array expected in second argument");
17+
}
18+
19+
final ArrayValue keys = ((ArrayValue) args[0]);
20+
final ArrayValue values = ((ArrayValue) args[1]);
21+
final int length = Math.min(keys.size(), values.size());
22+
23+
final MapValue result = new MapValue(length);
24+
for (int i = 0; i < length; i++) {
25+
result.set(keys.get(i), values.get(i));
26+
}
27+
return result;
28+
}
29+
30+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.exceptions.TypeException;
5+
import com.annimon.ownlang.lib.*;
6+
7+
public final class std_arrayKeyExists implements Function {
8+
9+
@Override
10+
public Value execute(Value... args) {
11+
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected");
12+
if (args[1].type() != Types.MAP) {
13+
throw new TypeException("Map expected in second argument");
14+
}
15+
final MapValue map = ((MapValue) args[1]);
16+
return NumberValue.fromBoolean(map.containsKey(args[0]));
17+
}
18+
19+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.exceptions.TypeException;
5+
import com.annimon.ownlang.lib.*;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
public final class std_arrayKeys implements Function {
11+
12+
@Override
13+
public Value execute(Value... args) {
14+
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected");
15+
if (args[0].type() != Types.MAP) {
16+
throw new TypeException("Map expected in first argument");
17+
}
18+
final MapValue map = ((MapValue) args[0]);
19+
final List<Value> keys = new ArrayList<>(map.size());
20+
for (Map.Entry<Value, Value> entry : map) {
21+
keys.add(entry.getKey());
22+
}
23+
return new ArrayValue(keys);
24+
}
25+
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.exceptions.TypeException;
5+
import com.annimon.ownlang.lib.*;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
public final class std_arrayValues implements Function {
11+
12+
@Override
13+
public Value execute(Value... args) {
14+
if (args.length != 1) throw new ArgumentsMismatchException("One argument expected");
15+
if (args[0].type() != Types.MAP) {
16+
throw new TypeException("Map expected in first argument");
17+
}
18+
final MapValue map = ((MapValue) args[0]);
19+
final List<Value> values = new ArrayList<>(map.size());
20+
for (Map.Entry<Value, Value> entry : map) {
21+
values.add(entry.getValue());
22+
}
23+
return new ArrayValue(values);
24+
}
25+
26+
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ public final class std implements Module {
1313
public void init() {
1414
Functions.set("echo", new std_echo());
1515
Functions.set("readln", new std_readln());
16-
Functions.set("newarray", new std_newarray());
17-
Functions.set("sort", new std_sort());
1816
Functions.set("length", new std_length());
1917
Functions.set("rand", new std_rand());
2018
Functions.set("time", new std_time());
@@ -36,5 +34,13 @@ public void init() {
3634
Functions.set("replace", new std_replace());
3735
Functions.set("replaceAll", new std_replaceall());
3836
Functions.set("replaceFirst", new std_replacefirst());
37+
38+
// Arrays and maps
39+
Functions.set("newarray", new std_newarray());
40+
Functions.set("sort", new std_sort());
41+
Functions.set("arrayCombine", new std_arrayCombine());
42+
Functions.set("arrayKeyExists ", new std_arrayKeyExists());
43+
Functions.set("arrayKeys ", new std_arrayKeys());
44+
Functions.set("arrayValues ", new std_arrayValues());
3945
}
4046
}

0 commit comments

Comments
 (0)