pub struct FnIterator<F, T>
where
F: FnMut() -> Option<T>,
{
f: F,
}
impl<F, T> FnIterator<F, T>
where
F: FnMut() -> Option<T>,
{
pub fn new(f: F) -> Self {
Self { f }
}
}
impl<F, T> Iterator for FnIterator<F, T>
where
F: FnMut() -> Option<T>,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
(self.f)()
}
}
#[test]
fn test_functional_iter() {
let item = 'a';
let mut iter = FnIterator::new(|| Some(item));
const N: usize = 100000;
for _ in 0..N {
assert_eq!(iter.next().unwrap(), item);
}
let iter = FnIterator::new(|| None::<i32>);
assert_eq!(iter.count(), 0);
let mut a_n1: usize = 0;
let mut a_n2: usize = 0;
let mut a_n3: usize = 1;
let mut iter = FnIterator::new(|| {
a_n1 = a_n2;
a_n2 = a_n3;
a_n3 = a_n1 + a_n2;
Some(a_n2)
});
assert_eq!(iter.nth(10 - 1).unwrap(), 55); }