rocal_ui/data_types/
queue.rs1use std::cell::RefCell;
2use std::rc::Rc;
3
4pub struct Queue<T>
5where
6 T: Clone,
7{
8 start: Option<Rc<RefCell<LinkedList<T>>>>,
9 end: Option<Rc<RefCell<LinkedList<T>>>>,
10 pub len: u64,
11}
12
13impl<T> Queue<T>
14where
15 T: Clone,
16{
17 pub fn new() -> Self {
18 Self {
19 start: None,
20 end: None,
21 len: 0,
22 }
23 }
24
25 pub fn enqueue(&mut self, node: T) {
26 let node = Rc::new(RefCell::new(LinkedList::new(node)));
27
28 if self.end.is_some() {
29 self.end.clone().unwrap().borrow_mut().right = Some(node.clone());
30 node.clone().borrow_mut().left = self.end.clone();
31 } else {
32 self.start = Some(node.clone());
33 }
34
35 self.end = Some(node.clone());
36 self.len += 1;
37 }
38
39 pub fn dequeue(&mut self) -> Option<T> {
40 let mut node: Option<Rc<RefCell<LinkedList<T>>>> = None;
41
42 if self.len > 0 {
43 if let Some(start) = self.start.clone() {
44 node = Some(start);
45 self.start = node.clone().unwrap().borrow().right.clone();
46 node.clone().unwrap().borrow_mut().left = None;
47 node.clone().unwrap().borrow_mut().right = None;
48 self.len -= 1;
49 }
50 } else {
51 self.start = None;
52 self.end = None;
53 }
54
55 match node {
56 Some(node) => Some(node.borrow().get_value().to_owned()),
57 None => None,
58 }
59 }
60
61 pub fn peek(&self) -> Option<T> {
62 if let Some(end) = self.end.clone() {
63 Some(end.borrow().get_value().to_owned())
64 } else {
65 None
66 }
67 }
68}
69
70struct LinkedList<T>
71where
72 T: Clone,
73{
74 right: Option<Rc<RefCell<LinkedList<T>>>>,
75 left: Option<Rc<RefCell<LinkedList<T>>>>,
76 value: T,
77}
78
79impl<T> LinkedList<T>
80where
81 T: Clone,
82{
83 pub fn new(value: T) -> Self {
84 Self {
85 right: None,
86 left: None,
87 value,
88 }
89 }
90
91 pub fn get_value(&self) -> &T {
92 &self.value
93 }
94}