ref: 8775024dce46b5ba730b8f892111d9d7b7c56a66
dir: /lib/std/striter.myr/
use "die" use "types" use "utf" use "strfind" use "option" pkg std = type chariter = struct rest : byte[:] ;; type charoffiter = struct str : byte[:] idx : size ;; type splititer = struct rest : byte[:] split : byte[:] ;; impl iterable chariter -> char impl iterable charoffiter -> (char, size) impl iterable splititer -> byte[:] const bychar : (str : byte[:] -> chariter) const bycharoff : (str : byte[:] -> charoffiter) const bysplit : (str : byte[:], split : byte[:] -> splititer) ;; impl iterable chariter -> char = __iternext__ = {ci, c if ci.rest.len == 0 -> false ;; (c#, ci.rest) = strstep(ci.rest) -> true } __iterfin__ = {ci, c } ;; const bychar = {str -> [.rest = str] } impl iterable charoffiter -> (char, size) = __iternext__ = {ci, cv var c if ci.idx == ci.str.len -> false ;; c = std.decode(ci.str[ci.idx:]) ci.idx += std.charlen(c) cv# = (c, ci.idx) -> true } __iterfin__ = {ci, c } ;; const bycharoff = {s -> [.str=s, .idx=0] } impl iterable splititer -> byte[:] = __iternext__ = {si, sp match std.strfind(si.rest, si.split) | `Some off: sp# = si.rest[:off] si.rest = si.rest[off + si.split.len:] -> true | `None: if si.rest.len > 0 sp# = si.rest si.rest = "" -> true ;; ;; -> false } __iterfin__ = {ci, c } ;; const bysplit = {str, split -> [.rest = str, .split = split] }