-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathalgebraic_lists.rs
62 lines (54 loc) · 1.4 KB
/
algebraic_lists.rs
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
#[derive(Debug, PartialEq, Eq)]
pub enum Cons<T: Clone> {
Cons(T, Box<Cons<T>>),
Null,
}
impl<T: Clone> Cons<T> {
pub fn new(head: T, tail: Self) -> Self {
Cons::Cons(head, box tail)
}
pub fn to_vec(&self) -> Vec<T> {
match &self {
Cons::Null => Vec::new(),
Cons::Cons(ref head, ref tail) => {
let mut head = vec![head.clone()];
head.extend(tail.to_vec());
head
}
}
}
}
impl<T: Clone> Cons<T> {
pub fn from_iter<I>(iter: I) -> Self
where
I: IntoIterator<Item = T>,
I::IntoIter: Iterator + DoubleEndedIterator,
{
iter.into_iter()
.rev()
.fold(Cons::Null, |list, elem| Cons::new(elem, list))
}
pub fn filter<P>(&self, predicate: P) -> Self
where
P: Fn(&T) -> bool,
{
let mut new_elements = Vec::new();
for element in self.to_vec().iter() {
if predicate(element) {
new_elements.push(element.clone());
}
}
Cons::from_iter(new_elements)
}
pub fn map<F, B>(&self, f: F) -> Cons<B>
where
F: Fn(T) -> B,
B: Clone,
{
let mut new_elements = Vec::new();
for element in self.to_vec().into_iter() {
new_elements.push(f(element));
}
Cons::from_iter(new_elements)
}
}