use crate::{error::LadataResult as Result, misc::DataCollection};
pub trait DataSinglyLinkedList: DataCollection {
type Node: DataSinglyLinkedListNode<Data = Self::Element>;
fn linked_first(&mut self) -> Result<Self::Node>;
fn linked_insert_after(
&mut self,
node: &mut Self::Node,
element: Self::Element,
) -> Result<Self::Node>;
fn linked_remove_after(&mut self, node: &mut Self::Node) -> Result<Option<Self::Node>>;
}
pub trait DataSinglyLinkedListNode: Sized {
type Data;
fn linked_data(&self) -> &Self::Data;
fn linked_data_mut(&mut self) -> &mut Self::Data;
fn linked_next(&self) -> Option<&Self>;
fn linked_next_mut(&mut self) -> Option<&mut Self>;
}
pub trait DataDoublyLinkedList: DataSinglyLinkedList {
fn linked_last(&mut self) -> Result<Option<Self::Node>>;
fn linked_insert_before(
&mut self,
node: &mut Self::Node,
element: Self::Element,
) -> Result<Self::Node>;
fn linked_remove_before(&mut self, node: &mut Self::Node) -> Result<Option<Self::Node>>;
}
pub trait DataDoublyLinkedListNode: DataSinglyLinkedListNode {
fn linked_prev(&self) -> Option<&Self>;
fn linked_prev_mut(&mut self) -> Option<&mut Self>;
}