xee-interpreter 0.2.0

Interpreter for XPath and XSLT
Documentation
use ahash::{HashMap, HashMapExt};

use xee_xpath_ast::Pattern;

use crate::function;

use super::pattern_lookup::PatternLookup;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ModeId(usize);

impl ModeId {
    pub fn new(id: usize) -> Self {
        ModeId(id)
    }

    pub fn get(&self) -> usize {
        self.0
    }
}

#[derive(Debug, Default)]
pub struct ModeLookup<V: Clone> {
    pub(crate) modes: HashMap<ModeId, PatternLookup<V>>,
}

impl<V: Clone> ModeLookup<V> {
    pub(crate) fn new() -> Self {
        Self {
            modes: HashMap::new(),
        }
    }

    pub(crate) fn lookup(
        &self,
        mode: ModeId,
        mut matches: impl FnMut(&Pattern<function::InlineFunctionId>) -> bool,
    ) -> Option<&V> {
        let pattern_lookup = self.modes.get(&mode)?;
        pattern_lookup.lookup(&mut matches)
    }

    pub fn add_rules(
        &mut self,
        mode: ModeId,
        rules: Vec<(Pattern<function::InlineFunctionId>, V)>,
    ) {
        let pattern_lookup = self.modes.entry(mode).or_insert_with(PatternLookup::new);

        pattern_lookup.add_rules(rules);
    }
}