Skip to main content

harper_core/expr/
longest_match_of.rs

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