summaryrefslogtreecommitdiff
path: root/lib/iter/reverse.myr
blob: 3647ba64d41e24e31cd7e3e71e9de27f40839aa6 (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
use std

pkg iter =
	type reverseiter(@a) = struct
		sl	: @a[:]
		idx	: std.size
	;;
	impl iterable reverseiter(@a) -> @a
	generic byreverse 	: (sl : @a[:] -> reverseiter(@a))
;;

generic byreverse = {sl
	-> [.sl = sl, .idx = sl.len]
}

impl iterable reverseiter(@a) -> @a =
	__iternext__ = {itp, valp
		if itp.idx > 0
			valp# = itp.sl[itp.idx - 1]
			itp.idx--
			-> true
		else
			-> false
		;;
	}

	__iterfin__ = {itp, valp
	}
;;