1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
use ;
use crateIntoIter;
use crateLinkedList;
use crateLinkedListTrait;
use crateQueueError;
use crateQueueTrait;
/// A generic queue data structure (FIFO - First In, First Out).
///
/// # Examples
///
/// ## Creating a queue
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let queue: Queue<i32> = Queue::new();
/// ```
///
/// ## Creating from a vector
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let queue: Queue<i16> = Queue::from_vec(vec![1, 2, 3]);
/// assert_eq!(3, queue.size());
/// ```
///
/// ## Enqueuing elements
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let mut queue = Queue::new();
/// queue.enqueue(1);
/// assert_eq!(1, queue.size());
/// ```
///
/// ## Dequeuing elements (front first)
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let mut queue = Queue::new();
/// queue.enqueue(10);
/// queue.enqueue(2);
///
/// assert_eq!(10, queue.dequeue().unwrap()); // returns the front element
/// assert_eq!(1, queue.size());
/// ```
///
/// ## Peeking without consuming
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let mut queue = Queue::new();
/// queue.enqueue(1);
///
/// assert_eq!(&1, queue.peek().unwrap()); // does not remove the element
/// assert_eq!(1, queue.size());
/// ```
///
/// ## Handling errors on empty queue
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let mut queue: Queue<i16> = Queue::new();
///
/// assert!(queue.dequeue().is_err());
/// assert!(queue.peek().is_err());
/// ```
///
/// ## Iterating (consumes the queue, front to back)
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let mut queue = Queue::new();
/// queue.enqueue(1);
/// queue.enqueue(2);
/// queue.enqueue(3);
///
/// let collected: Vec<i32> = queue.into_iter().collect();
/// assert_eq!(vec![1, 2, 3], collected); // front-first order
/// ```
///
/// ## Using iterator adapters
/// ```
/// use eldek_tad::queue::{queue::Queue, traits::queue_traits::QueueTrait};
///
/// let mut queue = Queue::new();
/// queue.enqueue(1);
/// queue.enqueue(2);
/// queue.enqueue(3);
///
/// let sum: i32 = queue.into_iter().sum();
/// assert_eq!(6, sum);
/// ```