Skip to main content

rstl_queue/
traits.rs

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> {}