include "std/assert.moc" struct Vec { Arr: slice u64: len impl: inline fn Vec.from_parts(Arr u64) -> [Vec] { cast(Vec) } inline fn Vec.new() -> [Vec] { 8 malloc:: 0 cast(Vec) } inline fn Vec.with_capacity(u64) -> [Vec] { malloc:: 0 cast(Vec) } inline fn Vec.delete(&Vec: self) { self::slice @ free } inline fn Vec.is_empty(&Vec: self) -> [bool] { self::len @ 0 == } inline fn Vec.slice_mut(*Vec: self) -> [Arr] { self::slice @ } inline fn Vec.slice(&Vec: self) -> [ConstArr] { self::slice::size @ self::slice::data @ cast(ConstArr) } fn Vec.push(T: value *Vec: self) { self::len @ 0 == if { 2 self::slice @ realloc self::slice ! } else self::len @ self::slice::size @ == if { self::slice::size @ 2 * self::slice @ realloc self::slice ! } value self::len @ self::slice @ Arr.set self::len @ 1 + self::len ! } fn Vec.pop(*Vec: self) -> [Option] { self::len @ 0 == if { Option.None:: } else { self::len @ 1 - self::len ! self::len @ self::slice @ Arr.get Option.Some } } fn Vec.get(u64: idx &Vec: self) -> [Option<&T>] { idx self::len @ >= if { Option.None::<&T> } else { idx self::slice @ Arr.get_ref Option.Some } } fn Vec.get_mut(u64: idx *Vec: self) -> [Option<*T>] { idx self::len @ >= if { Option.None::<*T> } else { idx self::slice @ Arr.get_ref_mut Option.Some } } fn Vec.at(u64: idx &Vec: self) -> [Option] { idx self::len @ >= if { Option.None:: } else { idx self::slice @ Arr.get Option.Some } } inline fn Vec.last(&Vec: self) -> [Option<&T>] { self::len @ 1- self Vec.get } inline fn Vec.capacity(&Vec: self) -> [u64] { self::slice::size @ } inline fn Vec.len(&Vec: self) -> [u64] { self::len @ } fn Vec.contains(T: item &Vec: self) -> [bool] { 0 while dup self Vec.len < do { as [i] i self Vec.at Option.unwrap item == if { true return } i 1 + } drop false } fn Vec.append(*Vec: other *Vec: self) { Vec.new:: as [mut temp] while other Vec.is_empty lnot do { other Vec.pop Option.unwrap *temp Vec.push } while &temp Vec.is_empty lnot do { *temp Vec.pop Option.unwrap self Vec.push } &temp Vec.delete } fn Vec.reverse(Vec: mut self) -> [Vec] { Vec.new:: as [mut rev] while &self Vec.is_empty lnot do { *self Vec.pop Option.unwrap *rev Vec.push } &self Vec.delete rev } } impl Format<&Vec> requires: [Format] { fn fmt(String &Vec) -> [String] { as [self] self Vec.len 0 == if { "[ ]" fmt return } '[' fmt 0 while dup self Vec.len 1 - < do { as [i] i self Vec.get Option.unwrap @ fmt ' ' fmt i 1 + } drop self Vec.last Option.unwrap @ fmt ']' fmt } } impl Format> requires: [Format] { fn fmt(String Vec) -> [String] { as [self] &self fmt &self Vec.delete } }