1use collection::Collection;
2use std::cmp::Ordering;
3
4pub trait QueueLike<T>: Collection<Item = T> {
5 fn front(&self) -> Option<&T>;
6 fn enqueue(&mut self, element: T);
7 fn dequeue(&mut self) -> Option<T>;
8
9 fn enqueues<I>(&mut self, elements: I)
10 where
11 I: IntoIterator<Item = T>,
12 {
13 for element in elements {
14 self.enqueue(element);
15 }
16 }
17
18 fn replace_front(&mut self, new_back: T) -> Option<T> {
19 let removed = self.dequeue();
20 self.enqueue(new_back);
21 removed
22 }
23}
24
25pub trait DequeLike<T>: QueueLike<T> {
26 fn back(&self) -> Option<&T>;
27 fn enqueue_front(&mut self, element: T);
28 fn dequeue_back(&mut self) -> Option<T>;
29
30 fn enqueues_front<I>(&mut self, elements: I)
31 where
32 I: IntoIterator<Item = T>,
33 {
34 for element in elements {
35 self.enqueue_front(element);
36 }
37 }
38
39 fn replace_back(&mut self, new_front: T) -> Option<T> {
40 let removed = self.dequeue_back();
41 self.enqueue_front(new_front);
42 removed
43 }
44}
45
46pub trait CircularQueueLike<T>: DequeLike<T> {
47 type Error;
48
49 fn capacity(&self) -> usize;
50 fn at(&self, index: isize) -> Option<&T>;
51 fn resize(&mut self, new_capacity: usize) -> Result<(), Self::Error>;
52 fn rearrange(&mut self);
53}
54
55pub trait PriorityQueueLike<T>: QueueLike<T> {
56 fn compare(&self, a: &T, b: &T) -> Ordering;
57}