68 lines
1.5 KiB
Text
68 lines
1.5 KiB
Text
|
|
int[]? map ((int) -> int f, int[]? l) {
|
||
|
|
if? (int[] a = l) {
|
||
|
|
var size = length(a);
|
||
|
|
var new_arr = new int[size] {i -> f(a[i])};
|
||
|
|
return new_arr;
|
||
|
|
} else {
|
||
|
|
return int[] null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int[]? filter ((int) -> bool f, int[]? l) {
|
||
|
|
if? (int[] a = l) {
|
||
|
|
var size = length(a);
|
||
|
|
var bool_arr = new bool[size] {i -> f(a[i])};
|
||
|
|
var new_size = 0;
|
||
|
|
for (var i = 0; i < size; i = i + 1;) {
|
||
|
|
if (bool_arr[i]) {
|
||
|
|
new_size = new_size + 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
var ind = 0;
|
||
|
|
var new_arr = new int[new_size];
|
||
|
|
for (var i = 0; i < size; i = i + 1;) {
|
||
|
|
if (bool_arr[i]) {
|
||
|
|
new_arr[ind] = a[i];
|
||
|
|
ind = ind + 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return new_arr;
|
||
|
|
} else {
|
||
|
|
return l;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int fold_left ((int, int) -> int f, int acc, int[] l, int curr_indx) {
|
||
|
|
var size = length(l);
|
||
|
|
if (curr_indx == size) {
|
||
|
|
return acc;
|
||
|
|
}
|
||
|
|
var new_acc = f(acc, l[curr_indx]);
|
||
|
|
return fold_left(f, new_acc, l, curr_indx + 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
int incr(int x) {
|
||
|
|
return x + 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool lt_five(int x) {
|
||
|
|
return x < 5;
|
||
|
|
}
|
||
|
|
|
||
|
|
int sum(int acc, int v) {
|
||
|
|
return acc + v;
|
||
|
|
}
|
||
|
|
|
||
|
|
int program(int argc, string[] argv) {
|
||
|
|
var l = new int[] {1, 2, 3, 7, 8, 9};
|
||
|
|
var mapped_l = map(incr, l);
|
||
|
|
if? (int[] a = mapped_l) {
|
||
|
|
print_int(a[0]);
|
||
|
|
}
|
||
|
|
var filtered_l = filter(lt_five, l);
|
||
|
|
if? (int[] a = filtered_l) {
|
||
|
|
print_int(length(a));
|
||
|
|
}
|
||
|
|
print_int(fold_left(sum, 0, l, 0));
|
||
|
|
return 0;
|
||
|
|
}
|