oni_comb_parser_rs/core/
parser.rs

1use crate::core::{ParseResult, ParseState};
2use std::marker::PhantomData;
3use std::rc::Rc;
4
5type Parse<'a, I, A> = dyn Fn(&ParseState<'a, I>) -> ParseResult<'a, I, A> + 'a;
6
7pub struct Parser<'a, I, A> {
8  pub(crate) method: Rc<Parse<'a, I, A>>,
9  _phantom: PhantomData<(&'a I, A)>,
10}
11
12impl<'a, I, A> Clone for Parser<'a, I, A> {
13  fn clone(&self) -> Self {
14    Self {
15      method: self.method.clone(),
16      _phantom: PhantomData,
17    }
18  }
19}
20
21impl<'a, I, A> Parser<'a, I, A> {
22  pub fn new<F>(parse: F) -> Parser<'a, I, A>
23  where
24    F: Fn(&ParseState<'a, I>) -> ParseResult<'a, I, A> + 'a, {
25    Parser {
26      method: Rc::new(parse),
27      _phantom: PhantomData,
28    }
29  }
30}