Buffers

Buffer is trait that wraps an Iterator. It extends upon this by requiring two extra methods

#![allow(unused)] fn main() { /// eagerly drops the first `n` elements in the buffer fn fast_forward(&mut self, n: usize); /// finds the `i`th element in the iterator, storing any read elements into a buffer for later access fn peek_ahead(&mut self, i: usize) -> Option<T> }

With these two method, the trait can implement a third method, cursor which returns a new Buffer type Cursor.

Cursor reads from a buffer only using peek_ahead. It ensures that any data read through the buffer can be read again in future.

#![allow(unused)] fn main() { use nommy::{Buffer, IntoBuf}; let mut buffer = (0..).into_buf(); let mut cursor1 = buffer.cursor(); // cursors act exactly like an iterator assert_eq!(cursor1.next(), Some(0)); assert_eq!(cursor1.next(), Some(1)); // cursors can be made from other cursors let mut cursor2 = cursor1.cursor(); assert_eq!(cursor2.next(), Some(2)); assert_eq!(cursor2.next(), Some(3)); // child cursors do not move the parent's iterator position assert_eq!(cursor1.next(), Some(2)); assert_eq!(buffer.next(), Some(0)); }

If you read from a cursor and decide that you won't need to re-read that contents again, you can call fast_forward_parent. This takes how many elements ahead the Cursor has read, and calls the parent buffer's fast_forward method with it.

#![allow(unused)] fn main() { use nommy::{Buffer, IntoBuf}; let mut input = "foobar".chars().into_buf(); let mut cursor = input.cursor(); assert_eq!(cursor.next(), Some('f')); assert_eq!(cursor.next(), Some('o')); assert_eq!(cursor.next(), Some('o')); // Typically, the next three calls to `next` would repeat // the first three calls because cursors read non-destructively. // However, this method allows to drop the already-read contents cursor.fast_forward_parent(); assert_eq!(input.next(), Some('b')); assert_eq!(input.next(), Some('a')); assert_eq!(input.next(), Some('r')); }

The standard implementation of Buffer is Buf, and can be created from any type that implements IntoIterator.