Skip to main content

harper_core/expr/
longest_match_of.rs

1use super::{AsBoxedExpr, Expr};
2use crate::{Span, Token};
3
4/// An [`Expr`] that returns the farthest offset of the longest match in a list of expressions.
5#[derive(Default)]
6pub struct LongestMatchOf {
7    exprs: Vec<Box<dyn Expr>>,
8}
9
10impl LongestMatchOf {
11    pub fn new(exprs: impl IntoIterator<Item = impl AsBoxedExpr>) -> Self {
12        Self {
13            exprs: exprs.into_iter().map(|e| e.into_boxed_expr()).collect(),
14        }
15    }
16
17    pub fn add(&mut self, expr: impl Expr + 'static) {
18        self.exprs.push(Box::new(expr));
19    }
20
21    pub fn add_boxed(&mut self, expr: Box<dyn Expr>) {
22        self.exprs.push(expr);
23    }
24}
25
26impl Expr for LongestMatchOf {
27    fn run(&self, cursor: usize, tokens: &[Token], source: &[char]) -> Option<Span<Token>> {
28        self.exprs
29            .iter()
30            .filter_map(|expr| expr.run(cursor, tokens, source))
31            .max_by_key(Span::len)
32    }
33}