module Std::Iter { import Std::Array::*; struct Iter { data: *T, len: uint, pos: uint, } /* Create an iterator from an Array */ func Array_Iter(arr: *Array) -> Iter { return Iter { data: arr.data, len: arr.len, pos: 0 }; } /* Check if there are more elements */ func Iter_HasNext(it: *Iter) -> bool { return it.pos < it.len; } /* Get the next element and advance (undefined if HasNext is false) */ func Iter_Next(it: *Iter) -> T { let val: T = it.data[it.pos]; it.pos = it.pos + 1; return val; } /* Peek current element without advancing (undefined if HasNext is false) */ func Iter_Peek(it: *Iter) -> T { return it.data[it.pos]; } /* Reset iterator to the beginning */ func Iter_Reset(it: *Iter) { it.pos = 0; } /* Current position */ func Iter_Pos(it: *Iter) -> uint { return it.pos; } /* Remaining length */ func Iter_Len(it: *Iter) -> uint { return it.len; } /* Count remaining elements */ func Iter_Count(it: *Iter) -> uint { return it.len - it.pos; } /* Skip N elements */ func Iter_Skip(it: *Iter, n: uint) { it.pos = it.pos + n; if it.pos > it.len { it.pos = it.len; } } /* Take first N elements (by limiting len) */ func Iter_Take(it: *Iter, n: uint) -> Iter { var endPos: uint = it.pos + n; if endPos > it.len { endPos = it.len; } return Iter { data: it.data, len: endPos, pos: it.pos }; } /* True if any remaining element equals value */ func Iter_AnyEq(it: *Iter, value: T) -> bool { var i: uint = it.pos; while i < it.len { if it.data[i] == value { return true; } i = i + 1; } return false; } /* True if every remaining element equals value (true if empty) */ func Iter_AllEq(it: *Iter, value: T) -> bool { var i: uint = it.pos; while i < it.len { if it.data[i] != value { return false; } i = i + 1; } return true; } /* Collect remaining elements into a new Array */ func Iter_Collect(it: *Iter) -> Array { let remaining: uint = it.len - it.pos; var cap: uint = remaining; if cap == 0 { cap = 1; } var arr: Array = Array_New(cap); var i: uint = it.pos; while i < it.len { Array_Push(&arr, it.data[i]); i = i + 1; } return arr; } }