okasaki 0.1.0

A collection of peristent datastructures
Documentation
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);
    }
}