pub struct Memory<I>
where
I: Iterator,
{
items: Vec<I::Item>,
underlying: I,
}
impl<I> Memory<I>
where
I: Iterator,
{
pub fn remember(&mut self, item: I::Item) {
self.items.push(item);
}
pub fn clear(&mut self) {
self.items.clear();
}
pub fn forget(&mut self) {
self.items.pop();
}
pub(crate) fn new(underlying: I) -> Self {
Self {
underlying,
items: vec![],
}
}
}
impl<I> Iterator for Memory<I>
where
I: Iterator,
{
type Item = I::Item;
fn next(&mut self) -> Option<Self::Item> {
if !self.items.is_empty() {
return self.items.pop();
}
self.underlying.next()
}
}
ext_impl! {
fn memory(self) -> Memory<Self> {
Memory::new(self)
}
}
#[cfg(test)]
mod test {
use crate::Rollercoaster;
fn mock() -> Vec<&'static str> {
vec!["a", "b", "c", "d", "e"]
}
#[test]
fn it_remembers() {
let mut memory = mock().into_iter().memory();
for letter in memory.by_ref() {
if letter == "d" {
memory.remember(letter);
break;
}
}
assert_eq!(memory.collect::<Vec<_>>(), vec!["d", "e"]);
}
#[test]
fn it_forgets() {
let mut memory = mock().into_iter().memory();
memory.remember("f");
memory.remember("g");
memory.forget();
assert_eq!(
memory.collect::<Vec<_>>(),
vec!["f", "a", "b", "c", "d", "e"]
);
}
}