geam-core 0.2.3

Typed Gleam planning, host, and execution core for Geam
Documentation
use super::evaluated::EvaluatedValue;
use super::state::list::{ListValueId, RuntimeListReader};

pub(in crate::runtime) struct RetainedList<Handle> {
    value: Handle,
    #[cfg(test)]
    item_reads: std::cell::Cell<usize>,
}

impl<Handle: Clone + Into<ListValueId>> RetainedList<Handle> {
    pub(in crate::runtime) fn new(value: Handle) -> Self {
        Self {
            value,
            #[cfg(test)]
            item_reads: std::cell::Cell::new(0),
        }
    }

    pub(in crate::runtime) fn len(&self) -> usize {
        RuntimeListReader.list_len(&self.value.clone().into())
    }

    pub(in crate::runtime) fn item(&self, index: usize) -> Option<EvaluatedValue> {
        #[cfg(test)]
        self.item_reads.set(self.item_reads.get() + 1);
        RuntimeListReader.evaluated_value_at(&self.value.clone().into(), index)
    }

    pub(in crate::runtime) fn handle(&self) -> &Handle {
        &self.value
    }

    #[cfg(test)]
    pub(in crate::runtime) fn item_reads(&self) -> usize {
        self.item_reads.get()
    }
}