array_utils API

array_utils は、パッケージ Luna-Flow/luna-utils のうち src/array_utils.mbt で定義される部分で、Array[T] に対する 12 個の関数からなります。これらはメソッドではなくパッケージレベルの関数なので、他のパッケージからは @luna-utils.arr_sum(xs) のように呼び出します。trait AddMonoid と Num は luna-generic のものです。

総和

fn[A : @luna-generic.AddMonoid] arr_sum(Array[A]) -> A
fn[A : @luna-generic.Num + Compare] arr_abs_sum(Array[A]) -> A
fn[A : @luna-generic.AddMonoid] zero_arr(Int) -> Array[A]

arr_sum(arr) は zero() から始めて、要素を左から右へ足し合わせます。空配列の総和は zero() です。

arr_abs_sum(arr) は同じ方法で要素の絶対値を足し合わせます。x の絶対値は、x < zero() のとき -x、それ以外のとき x です。

zero_arr(n) は、長さ n で要素がすべて zero() の新しい配列を返します。要素の型は期待される型で決まります。たとえば let zeros : Array[Double] = zero_arr(3) です。

最大値と最小値

fn[T : Compare] arr_max(Array[T]) -> T
fn[T : Compare] arr_min(Array[T]) -> T

arr_max(arr) と arr_min(arr) は最大の要素と最小の要素を返します。比較して等しい要素が複数ある場合は、そのうち最初のものを返します。どちらも空配列では panic します。

fn[T] reverse(Array[T]) -> Array[T]
fn[T] reverse_inplace(Array[T]) -> Unit
fn[T : Eq] find(Array[T], T) -> Int?

reverse(arr) は要素を逆順に並べた新しい配列を返し、arr は変更しません。reverse_inplace(arr) は両端から中央へ向かって要素を入れ替え、arr 自体を反転します。空配列はそのまま残ります。

find(arr, value) は arr[i] == value を満たす最初の添字 i を Some(i) として返し、value に等しい要素がなければ None を返します。

一様性の判定

fn[T : Eq] same(Array[T]) -> Bool
fn[T : Eq] same_to(Array[T], T) -> Bool
fn[U, V : Eq] map_same(Array[U], (U) -> V) -> Bool
fn[U, V : Eq] map_same_to(Array[U], V, (U) -> V) -> Bool
関数true を返す条件空配列の場合
same(arr)すべての要素が arr[0] に等しいpanic する
same_to(arr, sample)すべての要素が sample に等しいtrue を返す
map_same(arr, f)すべての f(x) が f(arr[0]) に等しいpanic する
map_same_to(arr, sample, f)すべての f(x) が sample に等しいtrue を返す

判定は最初に異なる要素が見つかった時点で止まります。map_same と map_same_to は先に写像後の配列を作るので、f はすべての要素に対して 1 回ずつ呼ばれます。