airlang 0.23.0

Air is a minimalist and universal programming language.
Documentation
use crate::cfg::CoreCfg;
use crate::semantics::cfg::Cfg;
use crate::semantics::core::Eval;
use crate::semantics::func::MutFn;
use crate::semantics::val::MapVal;
use crate::semantics::val::Val;

#[derive(Clone)]
pub struct Air {
    cfg: Cfg,
    ctx: Val,
}

impl Air {
    pub fn new(mut cfg: Cfg) -> Option<Self> {
        let ctx = CoreCfg::prelude(&mut cfg, "prelude")?;
        let ctx = Val::Map(MapVal::from(ctx));
        Some(Self { cfg, ctx })
    }

    pub fn interpret(&mut self, input: Val) -> Val {
        Eval.mut_call(&mut self.cfg, &mut self.ctx, input)
    }

    pub fn ctx(&self) -> &Val {
        &self.ctx
    }

    pub fn ctx_mut(&mut self) -> &mut Val {
        &mut self.ctx
    }

    pub fn cfg(&self) -> &Cfg {
        &self.cfg
    }

    pub fn cfg_mut(&mut self) -> &mut Cfg {
        &mut self.cfg
    }
}