use imhamt::Hamt;
use std::{collections::hash_map::DefaultHasher, sync::Arc};
#[derive(Clone, Debug)]
pub struct PersistentSequence<T> {
len: u64,
elements: Hamt<DefaultHasher, u64, Arc<T>>,
}
impl<T> PersistentSequence<T> {
pub fn new() -> Self {
PersistentSequence {
len: 0,
elements: Hamt::new(),
}
}
pub fn append(&self, t: T) -> Self {
let len = self.len + 1;
PersistentSequence {
len,
elements: self.elements.insert(len - 1, Arc::new(t)).unwrap(),
}
}
pub fn get<I: Into<u64>>(&self, i: I) -> Option<&Arc<T>> {
self.elements.lookup(&i.into())
}
pub fn len(&self) -> u64 {
self.len
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<T> Default for PersistentSequence<T> {
fn default() -> Self {
PersistentSequence::new()
}
}