//a lazy generator walking backwards
func reverse<C: BidirectionalCollection>(
_ data: C) -> some Sequence<C.Element> {
sequence(state: data.endIndex) {
(i: inout C.Index) -> C.Element? in
guard i > data.startIndex else {
return nil
}
i = data.index(before: i)
return data[i]
}
}
for c in reverse("string") {
print(c)
}
//printed g, n, i, r, t, s
for i in reverse([1, 2, 3]) {
print(i)
}
//printed 3, 2, 1
//the built-in way to do the same
print(Array("string".reversed()))