oom/
data.rs

1use std::collections::vec_deque::{IntoIter, Iter};
2use std::collections::VecDeque;
3use std::convert::{AsMut, AsRef};
4use std::iter::{FromIterator, IntoIterator};
5use std::ops::Range;
6
7use crate::Match;
8
9#[derive(Debug, Default)]
10pub struct Stack {
11    items: VecDeque<Match>,
12}
13
14impl Stack {
15    pub fn new() -> Stack {
16        Stack::default()
17    }
18
19    pub fn clear(&mut self) {
20        self.items.clear()
21    }
22
23    pub fn peek(&self) -> Option<Match> {
24        if let Some(matcher) = self.items.front() {
25            Some(matcher.clone())
26        } else {
27            None
28        }
29    }
30
31    pub fn peek_range(&self, range: &Range<isize>) -> Option<Stack> {
32        let substack = if range.start >= 0 && range.end >= 0 {
33            self.items
34                .range(range.start as usize..range.end as usize)
35                .map(Clone::clone)
36                .collect::<VecDeque<Match>>()
37        } else if range.start < 0 && range.end < 0 {
38            let mut items = Vec::<Match>::new();
39            for item in self.items.clone() {
40                items.push(item);
41            }
42            items[(range.start * -1) as usize..(range.end * -1) as usize]
43                .iter()
44                .map(Clone::clone)
45                .collect::<VecDeque<Match>>()
46        } else {
47            panic!("invalid range {:#?}", range);
48        };
49        if substack.is_empty() {
50            None
51        } else {
52            Some(Stack::from_iter(substack))
53        }
54    }
55
56    pub fn drop(&self) -> Option<Match> {
57        if let Some(matcher) = self.items.back() {
58            Some(matcher.clone())
59        } else {
60            None
61        }
62    }
63
64    pub fn push<T: Into<Match>>(&mut self, matcher: T) -> Option<Match> {
65        self.items.push_front(matcher.into());
66        if let Some(matcher) = self.items.front() {
67            Some(matcher.clone())
68        } else {
69            None
70        }
71    }
72
73    pub fn pop(&mut self) -> Option<Match> {
74        if let Some(matcher) = self.items.pop_front() {
75            Some(matcher)
76        } else {
77            None
78        }
79    }
80}
81
82impl AsRef<Stack> for Stack {
83    fn as_ref(&self) -> &Stack {
84        self
85    }
86}
87
88impl AsMut<Stack> for Stack {
89    fn as_mut(&mut self) -> &mut Stack {
90        self
91    }
92}
93
94impl<'c> FromIterator<&'c Match> for Stack {
95    fn from_iter<I: IntoIterator<Item = &'c Match>>(iter: I) -> Self {
96        let mut stack = Stack::new();
97        for r#match in iter {
98            stack.push(r#match.clone());
99        }
100        stack
101    }
102}
103
104impl FromIterator<Match> for Stack {
105    fn from_iter<I: IntoIterator<Item = Match>>(iter: I) -> Self {
106        let mut stack = Stack::new();
107        for r#match in iter {
108            stack.push(r#match);
109        }
110        stack
111    }
112}
113
114impl IntoIterator for Stack {
115    type IntoIter = IntoIter<Match>;
116    type Item = Match;
117
118    fn into_iter(self) -> IntoIter<Match> {
119        self.items.into_iter()
120    }
121}
122impl IntoIterator for &mut Stack {
123    type IntoIter = IntoIter<Match>;
124    type Item = Match;
125
126    fn into_iter(self) -> IntoIter<Match> {
127        self.items.clone().into_iter()
128    }
129}