use gazebo::{cast, cell::ARef};
use crate::values::Value;
pub(crate) struct ARefIterator<'a, 'v, T: ?Sized, I: Iterator<Item = Value<'v>>> {
#[allow(dead_code)]
aref: ARef<'a, T>,
iter: I,
}
impl<'a, 'v, T: ?Sized, I: Iterator<Item = Value<'v>>> ARefIterator<'a, 'v, T, I> {
pub fn new(aref: ARef<'a, T>, f: impl FnOnce(&'a T) -> I) -> Self {
let aref_ptr = unsafe { cast::ptr_lifetime(&*aref) };
let iter = f(aref_ptr);
Self { aref, iter }
}
}
impl<'a, 'v, T: ?Sized, I: Iterator<Item = Value<'v>>> Iterator for ARefIterator<'a, 'v, T, I> {
type Item = Value<'v>;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next()
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
}