use crate::{Eject, Mode};
#[derive(Debug, Clone)]
pub struct Constant<T: Eject>(T);
impl<T: Eject> Constant<T> {
pub fn new(circuit: T) -> Self {
assert!(circuit.eject_mode().is_constant());
Self(circuit)
}
}
impl<T: Eject> Eject for Constant<T> {
type Primitive = T::Primitive;
fn eject_mode(&self) -> Mode {
self.0.eject_mode()
}
fn eject_value(&self) -> Self::Primitive {
self.0.eject_value()
}
}
#[derive(Debug, Clone)]
pub enum CircuitType<T: Eject> {
Constant(Constant<T>),
Public,
Private,
}
impl<T: Eject> CircuitType<T> {
pub fn mode(&self) -> Mode {
match self {
CircuitType::Constant(constant) => constant.eject_mode(),
CircuitType::Public => Mode::Public,
CircuitType::Private => Mode::Private,
}
}
}
impl<T: Eject + Clone> From<T> for CircuitType<T> {
fn from(circuit: T) -> Self {
match circuit.eject_mode() {
Mode::Constant => CircuitType::Constant(Constant(circuit)),
Mode::Public => CircuitType::Public,
Mode::Private => CircuitType::Private,
}
}
}
impl<T: Eject + Clone> From<&T> for CircuitType<T> {
fn from(circuit: &T) -> Self {
match circuit.eject_mode() {
Mode::Constant => CircuitType::Constant(Constant(circuit.clone())),
Mode::Public => CircuitType::Public,
Mode::Private => CircuitType::Private,
}
}
}