2020-02-20 12:43:52 +03:00
|
|
|
-- Arrays.
|
2020-02-04 02:46:38 +03:00
|
|
|
-- (C) Dmitry Boulytchev, JetBrains Research, St. Petersburg State University, 2020
|
|
|
|
|
--
|
2020-02-20 12:43:52 +03:00
|
|
|
-- This unit provides a set of array-manipulation primitives. Note, some of these
|
|
|
|
|
-- primitives can be applied to any boxed value in Lama, not necessarily arrays
|
|
|
|
|
-- per se.
|
2020-02-04 02:46:38 +03:00
|
|
|
|
2020-01-16 06:59:34 +03:00
|
|
|
import List;
|
|
|
|
|
|
|
|
|
|
public fun initArray (n, f) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var a = makeArray (n), i;
|
2020-01-16 06:59:34 +03:00
|
|
|
|
|
|
|
|
for i := 0, i < n, i := i + 1 do
|
|
|
|
|
a [i] := f (i)
|
|
|
|
|
od;
|
|
|
|
|
|
|
|
|
|
a
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun mapArray (f, a) {
|
2020-08-02 23:56:21 +03:00
|
|
|
initArray (a.length, fun (i) {f (a[i])})
|
2020-01-16 06:59:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun arrayList (a) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var i = 0, res = [0, {}], curr = res;
|
2020-01-16 06:59:34 +03:00
|
|
|
|
|
|
|
|
for skip, i < a.length, i := i + 1 do
|
|
|
|
|
curr [1] := a [i] : curr [1];
|
|
|
|
|
curr := curr [1]
|
|
|
|
|
od;
|
|
|
|
|
|
|
|
|
|
res [1]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun listArray (l) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var a = makeArray (l.size);
|
2020-01-16 06:59:34 +03:00
|
|
|
|
|
|
|
|
fun inner (i, l) {
|
|
|
|
|
case l of {} -> skip | h : t -> a[i] := h; inner (i+1, t) esac
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inner (0, l);
|
|
|
|
|
a
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun foldlArray (f, acc, a) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var i = 0;
|
2020-01-16 06:59:34 +03:00
|
|
|
|
|
|
|
|
for skip, i < a.length, i := i+1 do
|
|
|
|
|
acc := f (acc, a[i])
|
|
|
|
|
od;
|
|
|
|
|
|
|
|
|
|
acc
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun foldrArray (f, acc, a) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var i = a.length - 1;
|
2020-01-16 06:59:34 +03:00
|
|
|
|
|
|
|
|
for skip, i >= 0, i := i-1 do
|
|
|
|
|
acc := f (acc, a[i])
|
|
|
|
|
od;
|
|
|
|
|
|
|
|
|
|
acc
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun iterArray (f, a) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var i = 0;
|
2020-01-16 06:59:34 +03:00
|
|
|
|
|
|
|
|
for skip, i < a.length, i := i+1 do
|
|
|
|
|
f (a [i])
|
|
|
|
|
od
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun iteriArray (f, a) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var i = 0;
|
2020-01-16 06:59:34 +03:00
|
|
|
|
|
|
|
|
for skip, i < a.length, i := i+1 do
|
|
|
|
|
f (i, a [i])
|
|
|
|
|
od
|
|
|
|
|
}
|