rocal_ui/data_types/
queue.rs

1use 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}