weighted-gss 0.2.2

Persistent weighted graph-structured stacks
Documentation
use std::sync::Arc;

#[derive(Clone)]
pub(crate) struct Segment<S> {
    data: Arc<Vec<S>>,
    start: usize,
    end: usize,
}

impl<S> Segment<S> {
    pub(crate) fn from_top_first(values: Vec<S>) -> Self {
        let end = values.len();
        Self {
            data: Arc::new(values),
            start: 0,
            end,
        }
    }

    pub(crate) fn one(value: S) -> Self {
        Self::from_top_first(vec![value])
    }

    pub(crate) fn len(&self) -> usize {
        self.end - self.start
    }

    pub(crate) fn is_empty(&self) -> bool {
        self.start == self.end
    }

    pub(crate) fn get(&self, depth: usize) -> Option<&S> {
        self.data
            .get(self.start + depth)
            .filter(|_| depth < self.len())
    }

    pub(crate) fn first(&self) -> Option<&S> {
        self.get(0)
    }

    pub(crate) fn iter(&self) -> impl DoubleEndedIterator<Item = &S> + ExactSizeIterator {
        self.data[self.start..self.end].iter()
    }

    pub(crate) fn drop_front(&self, count: usize) -> Option<Self> {
        if count >= self.len() {
            return None;
        }
        Some(Self {
            data: self.data.clone(),
            start: self.start + count,
            end: self.end,
        })
    }
}