use crate::list_second::List as Stack;
struct List<T> {
left: Stack<T>,
right: Stack<T>,
}
impl<T> List<T> {
pub fn new() -> Self {
List {
left: Stack::new(),
right: Stack::new(),
}
}
pub fn push_left(&mut self, elem: T) {
self.left.push(elem)
}
pub fn push_right(&mut self, elem: T) {
self.right.push(elem)
}
pub fn pop_left(&mut self) -> Option<T> {
self.left.pop()
}
pub fn pop_right(&mut self) -> Option<T> {
self.right.pop()
}
pub fn peek_left(&self) -> Option<&T> {
self.left.peek()
}
pub fn peek_right(&self) -> Option<&T> {
self.right.peek()
}
pub fn peek_left_mut(&mut self) -> Option<&mut T> {
self.left.peek_mut()
}
pub fn peek_right_mut(&mut self) -> Option<&mut T> {
self.right.peek_mut()
}
pub fn go_left(&mut self) -> bool {
self.left
.pop_node()
.map(|node| {
self.right.push_node(node);
})
.is_some()
}
pub fn go_right(&mut self) -> bool {
self.right
.pop_node()
.map(|node| {
self.left.push_node(node);
})
.is_some()
}
}
#[cfg(test)]
mod test {
use super::List;
#[test]
fn walk_aboot() {
let mut list = List::new();
list.push_left(0); list.push_right(1); assert_eq!(list.peek_left(), Some(&0));
assert_eq!(list.peek_right(), Some(&1));
list.push_left(2); list.push_left(3); list.push_right(4);
while list.go_left() {}
assert_eq!(list.pop_left(), None);
assert_eq!(list.pop_right(), Some(0)); assert_eq!(list.pop_right(), Some(2));
list.push_left(5); assert_eq!(list.pop_right(), Some(3)); assert_eq!(list.pop_left(), Some(5)); assert_eq!(list.pop_right(), Some(4)); assert_eq!(list.pop_right(), Some(1));
assert_eq!(list.pop_right(), None);
assert_eq!(list.pop_left(), None);
}
}