aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/dependency_resolver
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-12 04:03:11 +0900
committernsfisis <nsfisis@gmail.com>2026-05-12 04:03:11 +0900
commitcefc75e2ca4bce3135e880ebe80dc82986fc06aa (patch)
treec7c6c2e2fa30b908a4de6db31d26938c5b72cf1b /crates/shirabe/src/dependency_resolver
parent81a677bb2c11c105a14f7232c2a707ed4a7b7641 (diff)
downloadphp-shirabe-cefc75e2ca4bce3135e880ebe80dc82986fc06aa.tar.gz
php-shirabe-cefc75e2ca4bce3135e880ebe80dc82986fc06aa.tar.zst
php-shirabe-cefc75e2ca4bce3135e880ebe80dc82986fc06aa.zip
feat(port): port RuleWatchChain.php
Diffstat (limited to 'crates/shirabe/src/dependency_resolver')
-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);
+ }
+}