1use std::collections::VecDeque;
4use std::time::Instant;
5
6pub struct EitherQueue<L, R> {
8 left: VecDeque<(Instant, L)>,
9 right: VecDeque<(Instant, R)>
10}
11
12
13pub enum Either<L, R> {
14 Left(L),
15 Right(R)
16}
17
18impl<L, R> EitherQueue<L, R> {
19 #[inline(always)]
21 pub fn new() -> Self {
22 Self::default()
23 }
24
25
26 #[inline(always)]
36 pub fn len(&self) -> usize {
37 self.left.len() + self.right.len()
38 }
39
40
41 #[inline(always)]
42 pub fn left_len(&self) -> usize {
43 self.left.len()
44 }
45
46
47 #[inline(always)]
48 pub fn right_len(&self) -> usize {
49 self.right.len()
50 }
51
52
53 #[inline(always)]
65 pub fn is_empty(&self) -> bool {
66 self.left.is_empty() && self.right.is_empty()
67 }
68
69
70 #[inline(always)]
72 pub fn is_left_empty(&self) -> bool {
73 self.left.is_empty()
74 }
75
76
77 #[inline(always)]
79 pub fn is_right_empty(&self) -> bool {
80 self.right.is_empty()
81 }
82
83
84 #[inline(always)]
94 pub fn clear(&mut self) {
95 self.left.clear();
96 self.right.clear();
97 }
98
99
100 #[inline(always)]
101 pub fn push(&mut self, n: Either<L, R>) {
102 match n {
103 Either::Left(n) => self.push_left(n),
104 Either::Right(n) => self.push_right(n)
105 }
106 }
107
108
109 #[inline(always)]
110 pub fn push_left(&mut self, n: L) {
111 self.left.push_back((Instant::now(), n));
112 }
113
114
115 #[inline(always)]
116 pub fn push_right(&mut self, n: R) {
117 self.right.push_back((Instant::now(), n));
118 }
119
120
121 pub fn pop(&mut self) -> Option<Either<L, R>> {
123 if self.left.is_empty() {
124 if let Some((_, n)) = self.right.pop_front() {
126 Some(Either::Right(n))
127 } else {
128 None
130 }
131 } else if self.right.is_empty() {
132 if let Some((_, n)) = self.left.pop_front() {
134 Some(Either::Left(n))
135 } else {
136 unreachable!("Could not get node that is known to exist");
138 }
139 } else {
140 let next_left = {
144 let (li, _) = self
145 .left
146 .front()
147 .expect("Unable to get reference to expected front left node");
148 let (ri, _) = self
149 .right
150 .front()
151 .expect("Unable to get reference to expected front right node");
152 li <= ri
153 };
154
155 if next_left {
156 let (_, n) = self
157 .left
158 .pop_front()
159 .expect("Unexpectededly unable to get next left node");
160 Some(Either::Left(n))
161 } else {
162 let (_, n) = self
163 .right
164 .pop_front()
165 .expect("Unexpectededly unable to get next put node");
166 Some(Either::Right(n))
167 }
168 }
169 }
170
171
172 #[inline(always)]
174 pub fn pop_left(&mut self) -> Option<L> {
175 if let Some((_, n)) = self.left.pop_front() {
176 Some(n)
177 } else {
178 None
179 }
180 }
181
182
183 #[inline(always)]
185 pub fn pop_right(&mut self) -> Option<R> {
186 if let Some((_, n)) = self.right.pop_front() {
187 Some(n)
188 } else {
189 None
190 }
191 }
192}
193
194impl<L, R> Default for EitherQueue<L, R> {
195 fn default() -> Self {
196 Self {
197 left: VecDeque::new(),
198 right: VecDeque::new()
199 }
200 }
201}
202
203