use pergola::DefTraits;
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, BTreeSet};
#[serde(bound = "")]
#[derive(Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ExtVal<L: Lang> {
Initial,
Defined(L::Val),
Deleted,
}
pub trait Lang: DefTraits + 'static {
type Key: DefTraits + Send + Sync;
type Val: DefTraits + Send + Sync;
type Stmt: DefTraits + Send + Sync;
type Expr: DefTraits + Send + Sync;
fn get_write_set(s: &Self::Stmt) -> BTreeMap<Self::Key, Self::Expr>;
fn get_read_set(e: &Self::Expr) -> BTreeSet<Self::Key>;
fn get_eval_set(s: &Self::Stmt) -> BTreeSet<Self::Key>;
fn eval_expr(
e: &Self::Expr,
vals: &[Self::Val],
env: &BTreeMap<Self::Key, ExtVal<Self>>,
) -> ExtVal<Self>;
}