use core::fmt::Debug;
use ff::{PrimeField, PrimeFieldBits};
use num_bigint::BigInt;
use serde::{Deserialize, Serialize};
pub mod circuit;
pub mod pcs;
pub mod snark;
pub mod transcript;
use pcs::PCSEngineTrait;
use transcript::{TranscriptEngineTrait, TranscriptReprTrait};
pub use crate::big_num::{DelayedReduction, FieldReductionConstants};
pub trait Group: Clone + Copy + Debug + Send + Sync + Sized + Eq + PartialEq {
type Base: PrimeFieldBits + Serialize + for<'de> Deserialize<'de>;
type Scalar: PrimeFieldBits + PrimeFieldExt + Send + Sync + Serialize + for<'de> Deserialize<'de>;
fn group_params() -> (Self::Base, Self::Base, BigInt, BigInt);
}
pub trait Engine: Clone + Copy + Debug + Send + Sync + Sized + Eq + PartialEq {
type Base: PrimeFieldBits + TranscriptReprTrait<Self::GE> + Serialize + for<'de> Deserialize<'de>;
type Scalar: PrimeFieldBits
+ PrimeFieldExt
+ Send
+ Sync
+ TranscriptReprTrait<Self::GE>
+ Serialize
+ for<'de> Deserialize<'de>
+ FieldReductionConstants
+ DelayedReduction<Self::Scalar>;
type GE: Group<Base = Self::Base, Scalar = Self::Scalar> + Serialize + for<'de> Deserialize<'de>;
type TE: TranscriptEngineTrait<Self>;
type PCS: PCSEngineTrait<Self>;
}
pub trait PrimeFieldExt: PrimeField {
fn from_uniform(bytes: &[u8]) -> Self;
}