use smallvec::SmallVec;
use snarkvm_fields::PrimeField;
use core::fmt::Debug;
pub trait SpongeParameters<const RATE: usize, const CAPACITY: usize> {}
pub trait AlgebraicSponge<F: PrimeField, const RATE: usize, const CAPACITY: usize>: Clone + Debug {
type Parameters: SpongeParameters<RATE, CAPACITY>;
fn with_parameters(params: &Self::Parameters) -> Self;
fn absorb(&mut self, input: &[F]);
fn squeeze_field_elements(&mut self, num_elements: usize) -> SmallVec<[F; 10]>;
}
pub trait DefaultCapacityAlgebraicSponge<F: PrimeField, const RATE: usize>: AlgebraicSponge<F, RATE, 1> {
fn sample_parameters() -> Self::Parameters;
fn with_default_parameters() -> Self {
Self::with_parameters(&Self::sample_parameters())
}
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub enum DuplexSpongeMode {
Absorbing {
next_absorb_index: usize,
},
Squeezing {
next_squeeze_index: usize,
},
}