use alloc::vec::Vec;
use core::fmt::Debug;
use utils::{Deserializable, Serializable};
use crate::Hasher;
pub trait VectorCommitment<H: Hasher>: Sized {
type Options: Default;
type Proof: Clone + Serializable + Deserializable;
type MultiProof: Serializable + Deserializable;
type Error: Debug;
fn new(items: Vec<H::Digest>) -> Result<Self, Self::Error> {
Self::with_options(items, Self::Options::default())
}
fn with_options(items: Vec<H::Digest>, options: Self::Options) -> Result<Self, Self::Error>;
fn commitment(&self) -> H::Digest;
fn domain_len(&self) -> usize;
fn get_proof_domain_len(proof: &Self::Proof) -> usize;
fn get_multiproof_domain_len(proof: &Self::MultiProof) -> usize;
fn open(&self, index: usize) -> Result<(H::Digest, Self::Proof), Self::Error>;
#[allow(clippy::type_complexity)]
fn open_many(
&self,
indexes: &[usize],
) -> Result<(Vec<H::Digest>, Self::MultiProof), Self::Error>;
fn verify(
commitment: H::Digest,
index: usize,
item: H::Digest,
proof: &Self::Proof,
) -> Result<(), Self::Error>;
fn verify_many(
commitment: H::Digest,
indexes: &[usize],
items: &[H::Digest],
proof: &Self::MultiProof,
) -> Result<(), Self::Error>;
}