use ark_crypto_primitives::sponge::{CryptographicSponge, FieldElementSize};
use ark_ff::PrimeField;
#[derive(Clone)]
pub enum ChallengeGenerator<F: PrimeField, S: CryptographicSponge> {
Multivariate(S),
Univariate(F, F),
}
impl<F: PrimeField, S: CryptographicSponge> ChallengeGenerator<F, S> {
pub fn new_multivariate(sponge: S) -> Self {
Self::Multivariate(sponge)
}
pub fn new_univariate(sponge: &mut S) -> Self {
let gen = sponge.squeeze_field_elements(1)[0];
Self::Univariate(gen, gen)
}
pub fn try_next_challenge_of_size(&mut self, size: FieldElementSize) -> F {
match self {
Self::Multivariate(sponge) => sponge.squeeze_field_elements_with_sizes(&[size])[0],
Self::Univariate(gen, next) => {
let result = next.clone();
*next *= *gen;
result
}
}
}
pub fn next_challenge(&mut self) -> F {
self.try_next_challenge_of_size(FieldElementSize::Full)
}
pub fn into_sponge(self) -> Option<S> {
match self {
Self::Multivariate(s) => Some(s),
_ => None,
}
}
}