Reiterator
You know that one friend who can tell the same story over and over again, but you only really listen the first time? Maybe they even have a set of stories so interesting you only really needed to listen to it once?
This crate is that friend.
What?
This no_std
crate takes an iterator and caches its output, allowing you to access an immutable reference to the output of any referentially transparent iterator call.
Rewind it or set it ten elements ahead, and it'll gladly oblige, but only when you ask it. A little taste of lazy evaluation in eager-flavored Rust.
Plus, it returns the index of the value as well, but there are built-in map
-compatible mini-functions to get either the value or the index only:
use ;
let iter = vec!.reiterate; // None of the values are computed until...
let indexed = iter.at; // here. We only compute the first two, and we cache their results.
assert!;
assert_eq!;
assert_eq!;
let _ = iter.at; // Calls the iterator only once
let _ = iter.at; let _ = iter.at; let _ = iter.at; // All cached! Just a few clocks and pulling from the heap.
You can drive it like a normal Iterator
:
use ;
let mut iter = vec!.reiterate; // None of the values are computed or cached until...
assert_eq!;
assert_eq!; // Using the cached version
assert_eq!; // Note that `next` doesn't return a value for simplicity: would it return 'a' or 'b'?
assert_eq!; // ...but it does change the internal index
assert_eq!;
assert_eq!;
assert_eq!;
assert_eq!
An entire crate just to do that?
Yeah, I know. It's pretty simple. But the lifetimes and edge cases are hard to get right and easy to overlook, respectively.
Think of it as transferring all the pain you would have experienced down the road and transferring it to me, so fewer people overall in the world have to suffer. Utilitarian, really.