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}