Skip to content

Commit 5f25d6b

Browse files
committed
Добавлены функции std sort и functional sortby
1 parent 02fe4b6 commit 5f25d6b

File tree

11 files changed

+112
-2
lines changed

11 files changed

+112
-2
lines changed

program.own

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ nums = [[1, 2], [3], [], [4, 5]]
130130
nums = flatmap(nums, IDENTITY)
131131
println "flatmap"
132132
foreach(nums, ::echo)
133+
println "sort"
134+
foreach(sort(nums, def(a,b) = b - a), ::echo)
133135

134136
use "http"
135137

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ public ArrayValue(List<Value> values) {
4848
public ArrayValue(ArrayValue array) {
4949
this(array.elements);
5050
}
51+
52+
public Value[] getCopyElements() {
53+
final Value[] result = new Value[elements.length];
54+
System.arraycopy(elements, 0, result, 0, elements.length);
55+
return result;
56+
}
5157

5258
@Override
5359
public int type() {
@@ -97,6 +103,15 @@ public boolean equals(Object obj) {
97103
final ArrayValue other = (ArrayValue) obj;
98104
return Arrays.deepEquals(this.elements, other.elements);
99105
}
106+
107+
@Override
108+
public int compareTo(Value o) {
109+
if (o.type() == Types.ARRAY) {
110+
final int lengthCompare = Integer.compare(size(), ((ArrayValue) o).size());
111+
if (lengthCompare != 0) return lengthCompare;
112+
}
113+
return asString().compareTo(o.asString());
114+
}
100115

101116
@Override
102117
public String toString() {

src/com/annimon/ownlang/lib/FunctionValue.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public boolean equals(Object obj) {
5353
return Objects.equals(this.value, other.value);
5454
}
5555

56+
@Override
57+
public int compareTo(Value o) {
58+
return asString().compareTo(o.asString());
59+
}
60+
5661
@Override
5762
public String toString() {
5863
return asString();

src/com/annimon/ownlang/lib/MapValue.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ public boolean equals(Object obj) {
7777
return Objects.equals(this.map, other.map);
7878
}
7979

80+
@Override
81+
public int compareTo(Value o) {
82+
if (o.type() == Types.MAP) {
83+
final int lengthCompare = Integer.compare(size(), ((MapValue) o).size());
84+
if (lengthCompare != 0) return lengthCompare;
85+
}
86+
return asString().compareTo(o.asString());
87+
}
88+
8089
@Override
8190
public String toString() {
8291
return asString();

src/com/annimon/ownlang/lib/NumberValue.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,13 @@ public boolean equals(Object obj) {
5151
return Double.doubleToLongBits(this.value) == Double.doubleToLongBits(other.value);
5252
}
5353

54-
54+
@Override
55+
public int compareTo(Value o) {
56+
if (o.type() == Types.NUMBER) {
57+
return Double.compare(value, ((NumberValue)o).value);
58+
}
59+
return asString().compareTo(o.asString());
60+
}
5561

5662
@Override
5763
public String toString() {

src/com/annimon/ownlang/lib/StringValue.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ public boolean equals(Object obj) {
5454
return Objects.equals(this.value, other.value);
5555
}
5656

57+
@Override
58+
public int compareTo(Value o) {
59+
if (o.type() == Types.STRING) {
60+
return value.compareTo(((StringValue) o).value);
61+
}
62+
return asString().compareTo(o.asString());
63+
}
64+
5765
@Override
5866
public String toString() {
5967
return asString();

src/com/annimon/ownlang/lib/Value.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*
55
* @author aNNiMON
66
*/
7-
public interface Value {
7+
public interface Value extends Comparable<Value> {
88

99
double asNumber();
1010

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public void init() {
1616
Functions.set("flatmap", new functional_flatmap());
1717
Functions.set("reduce", new functional_reduce());
1818
Functions.set("filter", new functional_filter());
19+
Functions.set("sortby", new functional_sortby());
1920

2021
Functions.set("combine", new functional_combine());
2122

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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.Arrays;
7+
8+
public final class functional_sortby implements Function {
9+
10+
@Override
11+
public Value execute(Value... args) {
12+
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected");
13+
14+
if (args[0].type() != Types.ARRAY) {
15+
throw new TypeException("Array expected in first argument");
16+
}
17+
if (args[1].type() != Types.FUNCTION) {
18+
throw new TypeException("Function expected in second argument");
19+
}
20+
21+
final Value[] elements = ((ArrayValue) args[0]).getCopyElements();
22+
final Function function = ((FunctionValue) args[1]).getValue();
23+
Arrays.sort(elements, (o1, o2) -> function.execute(o1).compareTo(function.execute(o2)));
24+
return new ArrayValue(elements);
25+
}
26+
27+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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.Arrays;
7+
8+
public final class std_sort implements Function {
9+
10+
@Override
11+
public Value execute(Value... args) {
12+
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected");
13+
if (args[0].type() != Types.ARRAY) {
14+
throw new TypeException("Array expected in first argument");
15+
}
16+
final Value[] elements = ((ArrayValue) args[0]).getCopyElements();
17+
18+
switch (args.length) {
19+
case 1:
20+
Arrays.sort(elements);
21+
break;
22+
case 2:
23+
if (args[1].type() != Types.FUNCTION) {
24+
throw new TypeException("Function expected in second argument");
25+
}
26+
final Function comparator = ((FunctionValue) args[1]).getValue();
27+
Arrays.sort(elements, (o1, o2) -> (int) comparator.execute(o1, o2).asNumber());
28+
break;
29+
default:
30+
throw new ArgumentsMismatchException("Wrong number of arguments");
31+
}
32+
33+
return new ArrayValue(elements);
34+
}
35+
36+
}

0 commit comments

Comments
 (0)