use std::{cmp::max, fmt::Debug};
use ff::Field;
use super::circuit::Expression;
pub(crate) mod prover;
pub(crate) mod verifier;
#[derive(Clone, Debug)]
pub struct Argument<F: Field> {
name: String,
pub(crate) selector: Expression<F>,
pub(crate) constraint_expressions: Vec<Expression<F>>,
}
impl<F: Field> Argument<F> {
pub fn new(
name: String,
selector: Expression<F>,
constraint_expressions: Vec<Expression<F>>,
) -> Self {
Argument {
name,
selector,
constraint_expressions,
}
}
pub(crate) fn required_degree(&self) -> usize {
let degrees = self.constraint_expressions.iter().map(|e| e.degree());
max(2, degrees.max().unwrap_or(0)) }
pub fn name(&self) -> &str {
&self.name
}
pub fn selector(&self) -> &Expression<F> {
&self.selector
}
pub fn constraint_expressions(&self) -> &Vec<Expression<F>> {
&self.constraint_expressions
}
}