struct ListNode<T> {
value: T,
tail: Option<Box<List<T>>>,
}
impl<T> ListNode<T> {
fn len(&self) -> usize {
1 + self.tail.as_ref().map(|t| t.len()).unwrap_or_default()
}
}
struct List<T> {
head: Option<ListNode<T>>,
}
impl<T> Default for List<T> {
fn default() -> Self {
Self { head: None }
}
}
impl<T> List<T> {
pub fn new() -> Self {
Self::default()
}
pub fn len(&self) -> usize {
self.head.as_ref().map(|h| h.len()).unwrap_or_default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_list() {
let xs = List::<()>::new();
assert_eq!(xs.len(), 0);
}
}