use std::ops::{Add, AddAssign, Neg, Sub};
use ff::Field;
use midnight_curves::{Fq as MidnightBaseField, JubjubExtended as MidnightJubjub};
use crate::signature_scheme::BaseFieldElement;
pub(crate) type CircuitBase = MidnightBaseField;
pub(crate) type CircuitCurve = MidnightJubjub;
#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
pub struct CircuitBaseField(CircuitBase);
impl CircuitBaseField {
pub const ZERO: Self = Self(CircuitBase::ZERO);
pub const ONE: Self = Self(CircuitBase::ONE);
}
impl From<u64> for CircuitBaseField {
fn from(value: u64) -> Self {
Self(CircuitBase::from(value))
}
}
impl From<CircuitBase> for CircuitBaseField {
fn from(value: CircuitBase) -> Self {
Self(value)
}
}
impl From<CircuitBaseField> for CircuitBase {
fn from(value: CircuitBaseField) -> Self {
value.0
}
}
impl From<BaseFieldElement> for CircuitBaseField {
fn from(value: BaseFieldElement) -> Self {
value.0.into()
}
}
impl From<CircuitBaseField> for BaseFieldElement {
fn from(value: CircuitBaseField) -> Self {
Self(value.into())
}
}
impl From<BaseFieldElement> for CircuitBase {
fn from(value: BaseFieldElement) -> Self {
CircuitBaseField::from(value).into()
}
}
impl Add for CircuitBaseField {
type Output = Self;
fn add(self, rhs: Self) -> Self::Output {
Self(self.0 + rhs.0)
}
}
impl AddAssign for CircuitBaseField {
fn add_assign(&mut self, rhs: Self) {
self.0 += rhs.0;
}
}
impl Sub for CircuitBaseField {
type Output = Self;
fn sub(self, rhs: Self) -> Self::Output {
Self(self.0 - rhs.0)
}
}
impl Neg for CircuitBaseField {
type Output = Self;
fn neg(self) -> Self::Output {
Self(-self.0)
}
}