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}