use crate::FpGadget;
use snarkvm_algorithms::traits::{AlgebraicSponge, DefaultCapacityAlgebraicSponge};
use snarkvm_fields::PrimeField;
use snarkvm_r1cs::{ConstraintSystem, SynthesisError};
pub trait AlgebraicSpongeVar<
CF: PrimeField,
S: AlgebraicSponge<CF, RATE, CAPACITY>,
const RATE: usize,
const CAPACITY: usize,
>: Clone
{
type Parameters;
fn with_parameters<CS: ConstraintSystem<CF>>(cs: CS, params: &S::Parameters) -> Self;
fn constant<CS: ConstraintSystem<CF>>(cs: CS, sponge: &S) -> Self;
fn absorb<'a, CS: ConstraintSystem<CF>, I: Iterator<Item = &'a FpGadget<CF>>>(
&mut self,
cs: CS,
input: I,
) -> Result<(), SynthesisError>;
fn squeeze_field_elements<CS: ConstraintSystem<CF>>(
&mut self,
cs: CS,
num_elements: usize,
) -> Result<Vec<FpGadget<CF>>, SynthesisError>;
}
pub trait DefaultCapacityAlgebraicSpongeVar<
CF: PrimeField,
PS: DefaultCapacityAlgebraicSponge<CF, RATE>,
const RATE: usize,
>: AlgebraicSpongeVar<CF, PS, RATE, 1>
{
}