harper_core/patterns/
pattern_map.rs1use crate::LSend;
2use crate::Token;
3
4use super::Pattern;
5
6pub struct PatternMap<T>
16where
17 T: LSend,
18{
19 rows: Vec<Row<T>>,
20}
21
22struct Row<T>
23where
24 T: LSend,
25{
26 pub key: Box<dyn Pattern>,
27 pub element: T,
28}
29
30impl<T> Default for PatternMap<T>
31where
32 T: LSend,
33{
34 fn default() -> Self {
35 Self {
36 rows: Default::default(),
37 }
38 }
39}
40
41impl<T> PatternMap<T>
42where
43 T: LSend,
44{
45 pub fn insert(&mut self, pattern: impl Pattern + 'static, value: T) {
46 self.rows.push(Row {
47 key: Box::new(pattern),
48 element: value,
49 });
50 }
51
52 pub fn lookup(&self, tokens: &[Token], source: &[char]) -> Option<&T> {
54 for row in &self.rows {
55 let len = row.key.matches(tokens, source);
56
57 if len.is_some() {
58 return Some(&row.element);
59 }
60 }
61
62 None
63 }
64}
65
66impl<T> Pattern for PatternMap<T>
67where
68 T: LSend,
69{
70 fn matches(&self, tokens: &[Token], source: &[char]) -> Option<usize> {
71 self.rows
72 .iter()
73 .filter_map(|row| row.key.matches(tokens, source))
74 .next()
75 }
76}