use std::fmt::Debug;
use crate::values::Heap;
use crate::values::Value;
#[derive(Debug)]
pub struct StarlarkIterator<'v> {
value: Value<'v>,
index: usize,
heap: &'v Heap,
}
impl<'v> StarlarkIterator<'v> {
#[inline]
pub(crate) fn new(value: Value<'v>, heap: &'v Heap) -> StarlarkIterator<'v> {
StarlarkIterator {
value,
index: 0,
heap,
}
}
#[inline]
pub fn empty(heap: &'v Heap) -> StarlarkIterator<'v> {
Self::new(Value::new_empty_tuple(), heap)
}
}
impl<'v> Iterator for StarlarkIterator<'v> {
type Item = Value<'v>;
#[inline]
fn next(&mut self) -> Option<Value<'v>> {
let r = self.value.get_ref().iter_next(self.index, self.heap);
if r.is_some() {
self.index += 1;
} else {
self.value.get_ref().iter_stop();
self.value = Value::new_empty_tuple();
self.index = 0;
}
r
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.value.get_ref().iter_size_hint(self.index)
}
}
impl<'v> Drop for StarlarkIterator<'v> {
#[inline]
fn drop(&mut self) {
if !self.value.ptr_eq(Value::new_empty_tuple()) {
self.value.get_ref().iter_stop();
}
}
}