okasaki/
list.rs

1struct ListNode<T> {
2    value: T,
3    tail: Option<Box<List<T>>>,
4}
5
6impl<T> ListNode<T> {
7    fn len(&self) -> usize {
8        1 + self.tail.as_ref().map(|t| t.len()).unwrap_or_default()
9    }
10}
11
12struct List<T> {
13    head: Option<ListNode<T>>,
14}
15
16impl<T> Default for List<T> {
17    fn default() -> Self {
18        Self { head: None }
19    }
20}
21
22impl<T> List<T> {
23    pub fn new() -> Self {
24        Self::default()
25    }
26
27    pub fn len(&self) -> usize {
28        self.head.as_ref().map(|h| h.len()).unwrap_or_default()
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test_new_list() {
38        let xs = List::<()>::new();
39        assert_eq!(xs.len(), 0);
40    }
41}