use std::{collections::HashMap, fmt::Display};
use serde::{Deserialize, Serialize};
use slop_algebra::Field;
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum IrVar<F> {
Public(usize),
Preprocessed(usize),
Main(usize),
Constant(F),
InputArg(usize),
OutputArg(usize),
}
impl<F: Field> Display for IrVar<F> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
IrVar::Public(i) => write!(f, "Public({i})"),
IrVar::Preprocessed(i) => write!(f, "Preprocessed({i})"),
IrVar::Main(i) => write!(f, "Main({i})"),
IrVar::Constant(c) => write!(f, "{c}"),
IrVar::InputArg(i) => write!(f, "Input({i})"),
IrVar::OutputArg(i) => write!(f, "Output({i})"),
}
}
}
impl<F: Field> IrVar<F> {
pub fn to_lean(&self, is_operation: bool, input_mapping: &HashMap<usize, String>) -> String {
match self {
IrVar::Main(i) => format!("Main[{i}]"),
IrVar::InputArg(i) => {
if is_operation {
input_mapping.get(i).map_or(format!("I[{i}]"), std::clone::Clone::clone)
} else {
format!("InputArg({i})")
}
}
IrVar::Constant(c) => format!("{c}"),
IrVar::Public(i) => format!("Public[{i}]"),
IrVar::Preprocessed(i) => format!("Preprocessed[{i}]"),
IrVar::OutputArg(i) => format!("Output[{i}]"),
}
}
}
pub struct FuncCtx {
pub(crate) input_idx: usize,
pub(crate) output_idx: usize,
}
impl FuncCtx {
#[must_use]
pub fn new() -> Self {
Self { input_idx: 0, output_idx: 0 }
}
}
impl Default for FuncCtx {
fn default() -> Self {
Self::new()
}
}