use std::fmt::Formatter;
use std::fmt::Debug;
use crate::ops::Value;
use crate::types::TypeArg;
use crate::IncomingPort;
use crate::OutgoingPort;
use crate::ops;
pub type ConstFoldResult = Option<Vec<(OutgoingPort, ops::Value)>>;
pub trait ConstFold: Send + Sync {
fn fold(
&self,
type_args: &[TypeArg],
consts: &[(crate::IncomingPort, crate::ops::Value)],
) -> ConstFoldResult;
}
impl Debug for Box<dyn ConstFold> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "<custom constant folding>")
}
}
impl<T> ConstFold for T
where
T: Fn(&[(crate::IncomingPort, crate::ops::Value)]) -> ConstFoldResult + Send + Sync,
{
fn fold(
&self,
_type_args: &[TypeArg],
consts: &[(crate::IncomingPort, crate::ops::Value)],
) -> ConstFoldResult {
self(consts)
}
}
type FoldFn = dyn Fn(&[TypeArg], &[(IncomingPort, Value)]) -> ConstFoldResult + Send + Sync;
pub struct Folder {
pub folder: Box<FoldFn>,
}
impl ConstFold for Folder {
fn fold(&self, type_args: &[TypeArg], consts: &[(IncomingPort, Value)]) -> ConstFoldResult {
(self.folder)(type_args, consts)
}
}