//! ref: composer/src/Composer/DependencyResolver/RuleWatchChain.php use crate::dependency_resolver::RuleWatchNode; /// An extension of SplDoublyLinkedList with seek and removal of current element. #[derive(Debug)] pub struct RuleWatchChain { data: Vec>>, current_offset: usize, } impl RuleWatchChain { pub fn new() -> Self { Self { data: Vec::new(), current_offset: 0, } } pub(crate) fn rewind(&mut self) { self.current_offset = 0; } pub(crate) fn next(&mut self) { self.current_offset += 1; } pub(crate) fn valid(&self) -> bool { self.current_offset < self.data.len() } pub(crate) fn current(&self) -> &std::rc::Rc> { &self.data[self.current_offset] } pub(crate) fn unshift(&mut self, node: std::rc::Rc>) { self.data.insert(0, node); } fn key(&self) -> usize { self.current_offset } fn offset_unset(&mut self, offset: usize) { self.data.remove(offset); } /// Moves the internal iterator to the specified offset. pub fn seek(&mut self, offset: usize) { self.rewind(); for _ in 0..offset { self.next(); } } /// Removes the current element from the list. pub fn remove(&mut self) { let offset = self.key(); self.offset_unset(offset); self.seek(offset); } }