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