link_cli/sequences/
right_sequence_walker.rs1use 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}