shithub: mc

ref: 3d078d5439e93a3dfc4b808ab6bf02805d455ff8
dir: /lib/iter/chunk.myr/

View raw version
use std

pkg iter =
	type chunkiter(@a) = struct
		idx	: std.size
		blksz	: std.size
		sl	: @a[:]
	;;

	impl iterable chunkiter(@a) -> @a[:]
	generic bychunk	: (a : @a[:], chunk : std.size -> chunkiter(@a))
;;

generic bychunk = {a, sz
	-> [.sl = a, .idx = 0, .blksz = std.max(sz, 1)]
}

impl iterable chunkiter(@a) -> @a[:] =
	__iternext__ = {itp, valp
		var len

		len = std.min(itp.blksz, itp.sl.len - itp.idx)
		if itp.idx + len > itp.sl.len || itp.idx >= itp.sl.len
			-> false
		;;
		valp# = itp.sl[itp.idx: itp.idx + len]
		itp.idx += itp.blksz
		-> true
	}

	__iterfin__ = {itp, valp
	}
;;