use super::{AsBoxedExpr, Expr};
use crate::{Span, Token};
#[derive(Default)]
pub struct FirstMatchOf {
exprs: Vec<Box<dyn Expr>>,
}
impl FirstMatchOf {
pub fn new(exprs: impl IntoIterator<Item = impl AsBoxedExpr>) -> Self {
Self {
exprs: exprs.into_iter().map(|e| e.into_boxed_expr()).collect(),
}
}
pub fn add(&mut self, expr: impl Expr + 'static) {
self.exprs.push(Box::new(expr));
}
pub fn add_boxed(&mut self, expr: Box<dyn Expr>) {
self.exprs.push(expr);
}
}
impl Expr for FirstMatchOf {
fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option<Span<Token>> {
self.exprs
.iter()
.find_map(|p| p.run(cursor, tokens, source))
}
}