use crate::eval::Value;
use std::sync::Arc;
use super::monadic_computation::MonadicComputation;
pub type MonadicContinuation = Arc<dyn Fn(MonadicComputation<Value>, Arc<dyn Fn(Value) -> MonadicComputation<Value> + Send + Sync>) -> MonadicComputation<Value> + Send + Sync>;
pub type MonadicBindFunction = Option<Arc<dyn Fn(MonadicComputation<Value>, Arc<dyn Fn(Value) -> Value + Send + Sync>) -> MonadicComputation<Value> + Send + Sync>>;
#[derive(Clone)]
pub struct CustomMonadDefinition {
pub name: String,
pub pure_impl: Arc<dyn Fn(Value) -> MonadicComputation<Value> + Send + Sync>,
pub bind_impl: MonadicContinuation,
pub map_impl: MonadicBindFunction,
}
impl std::fmt::Debug for CustomMonadDefinition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "CustomMonadDefinition {{ name: {:?}, pure_impl: <function>, bind_impl: <function>, map_impl: {} }}",
self.name,
if self.map_impl.is_some() { "<function>" } else { "None" })
}
}