1#[cfg(feature = "no_std")]
2use std::prelude::*;
3
4use std::cell::RefCell;
5
6pub struct ImmutVecItem<T> {
7 prev: Option<usize>,
8 data: T
9}
10pub struct ImmutVec<'a, T> {
11 inner: &'a RefCell<Vec<ImmutVecItem<T>>>,
12 id: Option<usize>
13}
14impl<'a, T> Copy for ImmutVec<'a, T> {}
15impl<'a, T> Clone for ImmutVec<'a, T> {
16 fn clone(&self) -> Self {
17 Self {
18 inner: self.inner,
19 id: self.id
20 }
21 }
22}
23impl<'a, T> ImmutVec<'a, T> {
24 pub fn new(inner: &'a RefCell<Vec<ImmutVecItem<T>>>) -> Self {
25 Self {
26 inner,
27 id: None
28 }
29 }
30 #[must_use = "push does nothing to the original vector"]
31 pub fn push(self, item: T) -> Self {
32 let mut inner = self.inner.borrow_mut();
33 let id = inner.len();
34 inner.push(ImmutVecItem {
35 prev: self.id,
36 data: item
37 });
38 Self {
39 id: Some(id),
40 ..self
41 }
42 }
43}
44impl<'a, T: Clone> ImmutVec<'a, T> {
45 #[must_use = "pop does nothing to the original vector"]
46 pub fn pop(self) -> (Self, Option<T>) {
47 let inner = self.inner.borrow();
48 let id = match self.id {
49 None => return (self, None),
50 Some(id) => id
51 };
52 let item = &inner[id];
53 (Self {
54 id: item.prev,
55 ..self
56 }, Some(item.data.clone()))
57 }
58 pub fn iter_rev(self) -> ImmutVecIter<'a, T> {
59 ImmutVecIter(self)
60 }
61}
62
63pub struct ImmutVecIter<'a, T: Clone>(ImmutVec<'a, T>);
64impl<'a, T: Clone> Iterator for ImmutVecIter<'a, T> {
65 type Item = T;
66
67 fn next(&mut self) -> Option<Self::Item> {
68 let (new, item) = self.0.pop();
69 self.0 = new;
70 item
71 }
72}