Skip to main content

link_cli/sequences/
right_sequence_walker.rs

1use crate::link_storage::LinkStorage;
2use crate::sequences::{DefaultStack, TargetMatcher};
3
4#[derive(Clone, Copy, Debug)]
5pub struct RightSequenceWalker {
6    unicode_symbol_criterion_matcher: TargetMatcher,
7}
8
9impl RightSequenceWalker {
10    pub fn new(unicode_symbol_criterion_matcher: TargetMatcher) -> Self {
11        Self {
12            unicode_symbol_criterion_matcher,
13        }
14    }
15
16    pub fn walk(&self, links: &LinkStorage, sequence: u32) -> Vec<u32> {
17        let mut output = Vec::new();
18        let mut stack = DefaultStack::new();
19        stack.push(sequence);
20
21        while let Some(element) = stack.pop() {
22            if self
23                .unicode_symbol_criterion_matcher
24                .is_matched(links, element)
25            {
26                output.push(element);
27                continue;
28            }
29
30            if let Some(link) = links.get(element) {
31                stack.push(link.target);
32                stack.push(link.source);
33            }
34        }
35
36        output
37    }
38}