knave 0.9.3

A small Lisp for humans and agents that infers types and ownership and compiles to readable Rust
Documentation
use std::rc::Rc;

use rustc_hash::FxHashMap;

use super::ty::Type;
use crate::core::BindingId;

#[derive(Default)]
pub struct TemplateClauses {
    clauses: FxHashMap<BindingId, Vec<(Type, Rc<str>)>>,
}

impl TemplateClauses {
    pub fn add(&mut self, binding: BindingId, clauses: Vec<(Type, Rc<str>)>) {
        self.clauses.insert(binding, clauses);
    }

    pub fn chosen(&self, binding: BindingId, parameter: &Type) -> Option<&Rc<str>> {
        self.clauses
            .get(&binding)?
            .iter()
            .find(|(target, _)| target == parameter)
            .map(|(_, template)| template)
    }
}