1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use crate::parser::ast::AstInfo;
use crate::parser::peg::parse_pair::ParsePairSort;
use thiserror::Error;

pub trait GenerateAstInfo {
    type Result: AstInfo;

    fn generate(&mut self, pair: &ParsePairSort) -> Self::Result;
}

impl<F, M: AstInfo> GenerateAstInfo for F
where
    F: FnMut(&ParsePairSort) -> M,
{
    type Result = M;

    fn generate(&mut self, pair: &ParsePairSort) -> Self::Result {
        (self)(pair)
    }
}

#[derive(Debug, Error)]
pub enum FromPairsError {}

pub trait FromPairs<M: AstInfo> {
    fn from_pairs<G: GenerateAstInfo<Result = M>>(pair: &ParsePairSort, generator: &mut G) -> Self
    where
        Self: Sized;
}