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 }; } }