#![allow(dead_code)]
pub type PvecVersion = usize;
pub struct PersistentVector<T: Clone> {
versions: Vec<Vec<T>>,
}
impl<T: Clone> PersistentVector<T> {
pub fn new() -> Self {
Self {
versions: vec![Vec::new()],
}
}
pub fn current_version(&self) -> PvecVersion {
self.versions.len() - 1
}
pub fn push(&mut self, value: T) -> PvecVersion {
let mut next = self.versions.last().cloned().unwrap_or_default();
next.push(value);
self.versions.push(next);
self.current_version()
}
pub fn pop(&mut self) -> PvecVersion {
let mut next = self.versions.last().cloned().unwrap_or_default();
next.pop();
self.versions.push(next);
self.current_version()
}
pub fn set(&mut self, index: usize, value: T) -> Option<PvecVersion> {
let len = self.versions.last().map_or(0, |v| v.len());
if index >= len {
return None;
}
let mut next = self.versions.last().cloned().unwrap_or_default();
next[index] = value;
self.versions.push(next);
Some(self.current_version())
}
pub fn get(&self, index: usize) -> Option<&T> {
self.versions.last()?.get(index)
}
pub fn get_at(&self, version: PvecVersion, index: usize) -> Option<&T> {
self.versions.get(version)?.get(index)
}
pub fn len(&self) -> usize {
self.versions.last().map(|v| v.len()).unwrap_or(0)
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn version_count(&self) -> usize {
self.versions.len()
}
}
impl<T: Clone> Default for PersistentVector<T> {
fn default() -> Self {
Self::new()
}
}
pub fn new_persistent_vector<T: Clone>() -> PersistentVector<T> {
PersistentVector::new()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_push_and_get() {
let mut v: PersistentVector<i32> = PersistentVector::new();
v.push(10);
assert_eq!(v.get(0), Some(&10));
}
#[test]
fn test_old_version_preserved() {
let mut v: PersistentVector<i32> = PersistentVector::new();
v.push(1);
v.push(2);
assert_eq!(v.get_at(1, 0), Some(&1));
assert_eq!(v.get_at(1, 1), None);
}
#[test]
fn test_pop_creates_version() {
let mut v: PersistentVector<i32> = PersistentVector::new();
v.push(1);
let _vpush = v.push(2);
let vpop = v.pop();
assert_eq!(v.get_at(vpop, 1), None);
}
#[test]
fn test_set() {
let mut v: PersistentVector<i32> = PersistentVector::new();
v.push(1);
let new_ver = v.set(0, 99).expect("should succeed");
assert_eq!(v.get_at(new_ver, 0), Some(&99));
assert_eq!(v.get_at(1, 0), Some(&1));
}
#[test]
fn test_set_out_of_bounds() {
let mut v: PersistentVector<i32> = PersistentVector::new();
assert!(v.set(5, 42).is_none());
}
#[test]
fn test_len() {
let mut v: PersistentVector<i32> = PersistentVector::new();
v.push(1);
v.push(2);
assert_eq!(v.len(), 2);
}
#[test]
fn test_is_empty() {
let v: PersistentVector<i32> = PersistentVector::new();
assert!(v.is_empty());
}
#[test]
fn test_version_count() {
let mut v: PersistentVector<i32> = PersistentVector::new();
v.push(1);
v.push(2);
assert_eq!(v.version_count(), 3);
}
#[test]
fn test_default() {
let v: PersistentVector<i32> = PersistentVector::default();
assert!(v.is_empty());
}
#[test]
fn test_new_helper() {
let v = new_persistent_vector::<u8>();
assert!(v.is_empty());
}
}