use alloc::vec::Vec;
use super::{MastNodeEntry, MastNodeInfo};
use crate::{Word, mast::MastNodeId, serde::DeserializationError};
pub trait MastForestView {
fn node_count(&self) -> usize;
fn node_entry_at(&self, index: usize) -> Result<MastNodeEntry, DeserializationError>;
fn node_digest_at(&self, index: usize) -> Result<Word, DeserializationError>;
fn node_info_at(&self, index: usize) -> Result<MastNodeInfo, DeserializationError> {
Ok(MastNodeInfo::from_entry(
self.node_entry_at(index)?,
self.node_digest_at(index)?,
))
}
fn procedure_root_count(&self) -> usize;
fn procedure_root_at(&self, index: usize) -> Result<MastNodeId, DeserializationError>;
fn is_empty(&self) -> bool {
self.node_count() == 0
}
fn has_node(&self, index: usize) -> bool {
index < self.node_count()
}
fn all_node_infos(&self) -> Result<Vec<MastNodeInfo>, DeserializationError> {
(0..self.node_count()).map(|index| self.node_info_at(index)).collect()
}
fn procedure_roots(&self) -> Result<Vec<MastNodeId>, DeserializationError> {
(0..self.procedure_root_count())
.map(|index| self.procedure_root_at(index))
.collect()
}
}