ns std::core use std::unsafe::Pointer use std::unsafe::mem::{alloc, pointer_of) pub int Array : Monad + Default + Empty { const default = array::empty const empty = array::empty length: Int } impl ArrayImpl : Array { fld pointer: Pointer fld length: Int pub unsafe ctor(length: Int) { self.pointer = alloc(length * T::size()) self.length = length } pub ctor(pointer: Pointer, length: Int) { self.pointer = pointer self.length = length } pub unsafe fn set(index: Int, item: Pointer) { pointer.offset(index * T::size()).write(item.read()) } } pub mod array { // Usage: // let int_array = array::of(1, 2, 3) // assert_eq(3, int_array.length) pub fn of(ts: ...T): Array { unsafe { let array = ArrayImpl(ts.length) for (i, t) in ts.enumerate() { let t_pointer = pointer_of(t) array.set(i, t_pointer) } array } } pub extern fn of_length(length: Int, init_value: T): Array pub extern fn empty(): Array pub fn flatten(ats: Array>): Array { let total_ts = ats.map { ts -> ts.length } .reduce { acc, current -> acc + current } let result: mut Array = of_length(total_ts, std::reflect::default_or_empty) let i: mut Int = 0 for a in ats { for element in a { result[i] = element i++ } } result } }