summaryrefslogtreecommitdiff
path: root/lib/iter/chunk.myr
blob: 80a74e63df7db840e272bfbaf6746b2d12be16c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
	}
;;