chore(apb): improved iterator impl for Node

This commit is contained in:
zaaarf 2024-05-17 02:23:56 +02:00
parent 2c5304a0d5
commit 6411923a0d
No known key found for this signature in database
GPG key ID: 102E445F4C3F829B

View file

@ -19,18 +19,23 @@ impl<T : super::Base> From<Option<T>> for Node<T> {
// TODO how do i move out of the box for a moment? i need to leave it uninitialized while i update // TODO how do i move out of the box for a moment? i need to leave it uninitialized while i update
// the value and then put it back, i think it should be safe to do so! but i'm not sure how, so i'm // the value and then put it back, i think it should be safe to do so! but i'm not sure how, so i'm
// using a clone (expensive but simple solution) // using a clone (expensive but simple solution)
impl<T : super::Base + Clone> Iterator for Node<T> { impl<T : super::Base> Iterator for Node<T> {
type Item = T; type Item = T;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
let x = match self { match std::mem::replace(self, Self::Empty) {
Self::Empty => return None, Self::Empty => None,
Self::Link(_) => return None, Self::Object(res) => Some(*res),
Self::Array(arr) => return arr.pop_front(), // TODO weird that we iter in reverse Self::Link(lnk) => {
Self::Object(x) => *x.clone(), // TODO needed because next() on object can't get value without owning *self = Self::Link(lnk);
}; None
*self = Self::Empty; },
Some(x) Self::Array(mut arr) => {
let res = arr.pop_front();
*self = Self::Array(arr);
res
}
}
} }
} }