Mark
fn mark(&mut self) -> Result<(), Error> {
let mut previous = V::default();
let mut current = self.root;
loop {
let cons = Cons::from(current);
let value = self.get(cons.index())?;
if !value.is_marked() {
if value.is_pointer() {
self.set(cons.index(), previous.mark(true))?;
previous = current;
current = value;
} else {
self.set(cons.index(), value.mark(true))?;
}
} else if cons.index().is_multiple_of(2) {
current = Cons::new(cons.index() + 1).into();
} else if !previous.is_pointer() {
break;
} else {
let previous_cons = Cons::from(previous);
let current_cons = Cons::from(current);
previous = self.get(previous_cons.index())?;
self.set(
previous_cons.index(),
V::from(current_cons.set_index(current_cons.index() - 1)).mark(true),
)?;
current = previous_cons.into();
}
}
Ok(())
}