use super::{LinearCombination, R1CSError, Variable};
use ark_ff::PrimeField;
use merlin::Transcript;
pub trait ConstraintSystem<F: PrimeField> {
fn transcript(&mut self) -> &mut Transcript;
fn multiply(
&mut self,
left: LinearCombination<F>,
right: LinearCombination<F>,
) -> (Variable<F>, Variable<F>, Variable<F>);
fn allocate(&mut self, assignment: Option<F>) -> Result<Variable<F>, R1CSError>;
fn allocate_multiplier(
&mut self,
input_assignments: Option<(F, F)>,
) -> Result<(Variable<F>, Variable<F>, Variable<F>), R1CSError>;
fn multipliers_len(&self) -> usize;
fn constrain(&mut self, lc: LinearCombination<F>);
}
pub trait RandomizableConstraintSystem<F: PrimeField>: ConstraintSystem<F> {
type RandomizedCS: RandomizedConstraintSystem<F>;
fn specify_randomized_constraints<FF>(&mut self, callback: FF) -> Result<(), R1CSError>
where
FF: 'static + Fn(&mut Self::RandomizedCS) -> Result<(), R1CSError>;
}
pub trait RandomizedConstraintSystem<F: PrimeField>: ConstraintSystem<F> {
fn challenge_scalar(&mut self, label: &'static [u8]) -> F;
}