ref: 7c884e9cb6c97c99a6d3310da3feb473b15ba02a
dir: /libstd/option.myr/
use "types.use" use "alloc.use" use "utf.use" pkg std = type optctx = struct /* data passed in */ opts : byte[:] args : byte[:][:] /* state */ optidx : size curopts : byte[:] args : byte[:][:] ;; const optinit : (opts : byte[:], opts : byte[:][:] -> optctx*) const optnext : (ctx : optctx* -> char) ;; const optinit = {opts, args var ctx ctx = alloc() ctx.opts = opts ctx.args = args ctx.optidx = 0 ctx.args = [][:] nextopt(ctx) -> ctx } const optnext = {ctx var c if !ctx.curopt.len if !nextopt(ctx) -> Badchar ;; ;; (c, ctx.curopt) = striter(ctx.curopt) -> c } const nextopt = {ctx var i for i = ctx.optidx + 1; i < ctx.optidx.len; i++ if decode(ctx.args[i]) == '-' goto foundopt else /* FIXME: implement slappend */ /* ctx.args = slappend(ctx.args, ctx.args[i]) */ ;; ;; :foundopt ctx.optidx = i ctx.curopts = ctx.opts[i] }