use std::fmt;
use std::sync::Arc;
#[derive(Clone)]
pub struct StreamingPolynomial {
num_vars: usize,
modulus: u64,
evaluator: Arc<dyn Fn(usize) -> u64 + Send + Sync>,
}
impl fmt::Debug for StreamingPolynomial {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("StreamingPolynomial")
.field("num_vars", &self.num_vars)
.field("modulus", &self.modulus)
.finish()
}
}
impl StreamingPolynomial {
pub fn new<F>(num_vars: usize, modulus: u64, evaluator: F) -> Self
where
F: Fn(usize) -> u64 + Send + Sync + 'static,
{
Self {
num_vars,
modulus,
evaluator: Arc::new(evaluator),
}
}
pub fn num_vars(&self) -> usize {
self.num_vars
}
pub fn modulus(&self) -> u64 {
self.modulus
}
pub fn evaluate(&self, idx: usize) -> u64 {
(self.evaluator)(idx)
}
pub fn evaluator(&self) -> Arc<dyn Fn(usize) -> u64 + Send + Sync> {
Arc::clone(&self.evaluator)
}
}