diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-12 04:03:11 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-12 04:03:11 +0900 |
| commit | cefc75e2ca4bce3135e880ebe80dc82986fc06aa (patch) | |
| tree | c7c6c2e2fa30b908a4de6db31d26938c5b72cf1b /crates/shirabe/src/dependency_resolver | |
| parent | 81a677bb2c11c105a14f7232c2a707ed4a7b7641 (diff) | |
| download | php-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.rs | 48 |
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); + } +} |
