yoyu 0.0.1

A compact infrastructure built from scratch.
Documentation

use std::ptr;

pub struct List {
    pub next: *mut List,
    pub prev: *mut List,
}

impl List {
    pub fn new() -> Box<Self> {
        let mut node = Box::new(List {
            next: ptr::null_mut(),
            prev: ptr::null_mut(),
        });
        node.init();
        node
    }

    pub fn init(&mut self) {
        self.next = self;
        self.prev = self;
    }

    pub fn is_empty(&mut self) -> bool {
        self.next == self as *mut List &&
        self.prev == self as *mut List
    }

    pub fn append(&mut self, node: &mut List) {
        node.next = self;
        node.prev = self.prev;
        unsafe { (*self.prev).next = node; }
        self.prev = node;
    }

    pub fn prepend(&mut self, node: &mut List) {
        node.prev = self;
        node.next = self.next;
        unsafe { (*self.next).prev = node; }
        self.next = node;
    }

    pub fn delete(&mut self) {
        if self.is_empty() { return; }
        unsafe {
            (*self.prev).next = self.next;
            (*self.next).prev = self.prev;
        }
    }
    
}

use std::fmt;

impl fmt::Display for List {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(
            f,
            "[{:p}] [{:p}] [{:p}]",
            self, self.next, self.prev
        )
    }
}