#![allow(dead_code)]
use std::collections::VecDeque;
pub struct FingerTree<T> {
data: VecDeque<T>,
}
impl<T: Clone> FingerTree<T> {
pub fn new() -> Self {
Self {
data: VecDeque::new(),
}
}
pub fn push_left(&mut self, value: T) {
self.data.push_front(value);
}
pub fn push_right(&mut self, value: T) {
self.data.push_back(value);
}
pub fn pop_left(&mut self) -> Option<T> {
self.data.pop_front()
}
pub fn pop_right(&mut self) -> Option<T> {
self.data.pop_back()
}
pub fn peek_left(&self) -> Option<&T> {
self.data.front()
}
pub fn peek_right(&self) -> Option<&T> {
self.data.back()
}
pub fn concat(&mut self, other: FingerTree<T>) {
for item in other.data {
self.data.push_back(item);
}
}
pub fn split_at(&mut self, at: usize) -> FingerTree<T> {
let right: VecDeque<T> = self.data.split_off(at);
FingerTree { data: right }
}
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
pub fn to_vec(&self) -> Vec<T> {
self.data.iter().cloned().collect()
}
}
impl<T: Clone> Default for FingerTree<T> {
fn default() -> Self {
Self::new()
}
}
pub fn new_finger_tree<T: Clone>() -> FingerTree<T> {
FingerTree::new()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_push_left() {
let mut ft: FingerTree<i32> = FingerTree::new();
ft.push_left(1);
ft.push_left(2);
assert_eq!(ft.peek_left(), Some(&2));
}
#[test]
fn test_push_right() {
let mut ft: FingerTree<i32> = FingerTree::new();
ft.push_right(1);
ft.push_right(2);
assert_eq!(ft.peek_right(), Some(&2));
}
#[test]
fn test_pop_left() {
let mut ft: FingerTree<i32> = FingerTree::new();
ft.push_right(10);
assert_eq!(ft.pop_left(), Some(10));
}
#[test]
fn test_pop_right() {
let mut ft: FingerTree<i32> = FingerTree::new();
ft.push_right(5);
assert_eq!(ft.pop_right(), Some(5));
}
#[test]
fn test_concat() {
let mut left: FingerTree<i32> = FingerTree::new();
let mut right: FingerTree<i32> = FingerTree::new();
left.push_right(1);
right.push_right(2);
left.concat(right);
assert_eq!(left.len(), 2);
}
#[test]
fn test_split_at() {
let mut ft: FingerTree<i32> = FingerTree::new();
for i in 0..6 {
ft.push_right(i);
}
let right = ft.split_at(3);
assert_eq!(ft.len(), 3);
assert_eq!(right.len(), 3);
}
#[test]
fn test_to_vec() {
let mut ft: FingerTree<i32> = FingerTree::new();
ft.push_right(1);
ft.push_right(2);
ft.push_right(3);
assert_eq!(ft.to_vec(), vec![1, 2, 3]);
}
#[test]
fn test_len_and_is_empty() {
let ft: FingerTree<i32> = FingerTree::new();
assert!(ft.is_empty());
let mut ft2 = ft;
ft2.push_right(1);
assert_eq!(ft2.len(), 1);
}
#[test]
fn test_default() {
let ft: FingerTree<i32> = FingerTree::default();
assert!(ft.is_empty());
}
#[test]
fn test_new_helper() {
let ft = new_finger_tree::<u8>();
assert!(ft.is_empty());
}
}