import "./option.zc" struct Slice { data: T*; len: usize; } struct SliceIter { data: T*; count: usize; idx: usize; } impl SliceIter { fn next(self) -> Option { if (self.idx < self.count) { let item = self.data[self.idx]; self.idx = self.idx + 1; return Option::Some(item); } return Option::None(); } fn iterator(self) -> SliceIter { return *self; } } impl Slice { fn from_array(arr: T*, len: usize) -> Slice { return Slice { data: arr, len: len }; } fn iterator(self) -> SliceIter { return SliceIter { data: self.data, count: self.len, idx: 0 }; } fn length(self) -> usize { return self.len; } fn is_empty(self) -> bool { return self.len == 0; } fn get(self, idx: usize) -> Option { if (idx >= self.len) { return Option::None(); } return Option::Some(self.data[idx]); } fn at(self, idx: usize) -> Option { if idx >= self.len { return Option::None(); } return Option::Some(self.data[idx]); } }