ns std::core pub int Array : Monad + Default + Empty { const default = array::empty const empty = array::empty length: Int } pub mod array { // Usage: // let int_array = array::of(1, 2, 3) // assert_eq(3, int_array.length) pub extern fn of(ts: ...T): 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 } }