mithril-common 0.7.14

Common types, interfaces, and utilities for Mithril nodes.
use crate::{
    StdResult,
    crypto_helper::{MKMap, MKMapNode, MKTree, MKTreeNode, MKTreeStorer},
    entities::BlockRange,
};

pub(crate) mod mkmap_helpers {
    use super::*;

    pub fn fold_nodes_per_block_range_into_mkmap<N, I, S>(
        nodes_per_block_range: I,
    ) -> StdResult<MKMap<BlockRange, MKMapNode<BlockRange, S>, S>>
    where
        N: Into<MKTreeNode> + Clone,
        I: IntoIterator<Item = (BlockRange, Vec<N>)>,
        S: MKTreeStorer,
    {
        let mk_map = MKMap::<_, _, S>::new(
            nodes_per_block_range
                .into_iter()
                .try_fold(
                    vec![],
                    |mut acc, (block_range, nodes)| -> StdResult<Vec<(_, MKMapNode<_, S>)>> {
                        acc.push((block_range, MKTree::<S>::new(&nodes)?.into()));
                        Ok(acc)
                    },
                )?
                .as_slice(),
        )?;

        Ok(mk_map)
    }
}