rocal_ui/data_types/
stack.rs

1use std::{cell::RefCell, rc::Rc};
2
3#[derive(Debug)]
4pub struct Stack<T>
5where
6    T: Clone,
7{
8    top: Option<Rc<RefCell<LinkedList<T>>>>,
9    pub len: u64,
10}
11
12impl<T> Stack<T>
13where
14    T: Clone,
15{
16    pub fn new() -> Self {
17        Self { top: None, len: 0 }
18    }
19
20    pub fn push(&mut self, node: T) {
21        let node = Rc::new(RefCell::new(LinkedList {
22            next: self.top.clone(),
23            value: node,
24        }));
25
26        self.top = Some(node.clone());
27        self.len += 1;
28    }
29
30    pub fn pop(&mut self) -> Option<T> {
31        if let Some(top) = self.top.clone() {
32            self.top = top.borrow().next.clone();
33            self.len -= 1;
34            Some(top.borrow().get_value().to_owned())
35        } else {
36            None
37        }
38    }
39
40    pub fn peek(&self) -> Option<T> {
41        if let Some(top) = self.top.clone() {
42            Some(top.borrow().get_value().to_owned())
43        } else {
44            None
45        }
46    }
47}
48
49#[derive(Debug)]
50struct LinkedList<T>
51where
52    T: Clone,
53{
54    next: Option<Rc<RefCell<LinkedList<T>>>>,
55    value: T,
56}
57
58impl<T> LinkedList<T>
59where
60    T: Clone,
61{
62    pub fn get_value(&self) -> &T {
63        &self.value
64    }
65}