lama_byterun/stdlib/Array.lama
Dmitry Boulytchev 11203f3a85 Added arrayFind
2021-08-31 01:47:49 +03:00

91 lines
No EOL
1.5 KiB
Text

-- Arrays.
-- (C) Dmitry Boulytchev, JetBrains Research, St. Petersburg State University, 2020
--
-- 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.
import List;
public fun initArray (n, f) {
var a = makeArray (n), i;
for i := 0, i < n, i := i + 1 do
a [i] := f (i)
od;
a
}
public fun mapArray (f, a) {
initArray (a.length, fun (i) {f (a[i])})
}
public fun arrayList (a) {
var i = 0, res = [0, {}], curr = res;
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) {
var a = makeArray (l.size);
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) {
var i = 0;
for skip, i < a.length, i := i+1 do
acc := f (acc, a[i])
od;
acc
}
public fun foldrArray (f, acc, a) {
var i = a.length - 1;
for skip, i >= 0, i := i-1 do
acc := f (acc, a[i])
od;
acc
}
public fun iterArray (f, a) {
var i = 0;
for skip, i < a.length, i := i+1 do
f (a [i])
od
}
public fun iteriArray (f, a) {
var i = 0;
for skip, i < a.length, i := i+1 do
f (i, a [i])
od
}
public fun findArray (f, a) {
var i = 0, found = false, value;
while i < a.length && found == false
do
found := f (value := a[i])
od;
if found then Some (value) else None fi
}