aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver/rule_watch_chain.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/dependency_resolver/rule_watch_chain.rs')
-rw-r--r--crates/shirabe/src/dependency_resolver/rule_watch_chain.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/crates/shirabe/src/dependency_resolver/rule_watch_chain.rs b/crates/shirabe/src/dependency_resolver/rule_watch_chain.rs
index aed4729..3d04f1c 100644
--- a/crates/shirabe/src/dependency_resolver/rule_watch_chain.rs
+++ b/crates/shirabe/src/dependency_resolver/rule_watch_chain.rs
@@ -1 +1,49 @@
//! ref: composer/src/Composer/DependencyResolver/RuleWatchChain.php
+
+use crate::dependency_resolver::rule_watch_node::RuleWatchNode;
+
+/// An extension of SplDoublyLinkedList with seek and removal of current element.
+pub struct RuleWatchChain {
+ data: Vec<RuleWatchNode>,
+ current_offset: usize,
+}
+
+impl RuleWatchChain {
+ pub fn new() -> Self {
+ Self {
+ data: Vec::new(),
+ current_offset: 0,
+ }
+ }
+
+ fn rewind(&mut self) {
+ self.current_offset = 0;
+ }
+
+ fn next(&mut self) {
+ self.current_offset += 1;
+ }
+
+ 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);
+ }
+}