use crate::*;
use chumsky::input::ValueInput;
use chumsky::prelude::*;
use scarf_syntax::Span;
use scarf_syntax::*;
pub fn foldl_vector<T>(mut a: Vec<T>, b: T) -> Vec<T> {
a.push(b);
a
}
pub fn convert_span(simple_span: ParserSpan) -> Span {
simple_span.into()
}
pub fn extra_node_parser<'a, I>() -> impl Parser<'a, I, Vec<(ExtraNode<'a>, Span)>, ParserError<'a>>
where
I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
{
select! {
Token::OnelineComment(text) = e => (ExtraNode::OnelineComment(text), convert_span(e.span())),
Token::BlockComment(text) = e => (ExtraNode::BlockComment(text), convert_span(e.span())),
Token::Newline = e => (ExtraNode::Newline, convert_span(e.span()))
}
.labelled("whitespace/comment")
.repeated()
.collect::<Vec<(ExtraNode<'a>, Span)>>()
}
pub fn replace_nodes<'a>(
old_metadata: Metadata<'a>,
new_nodes: Vec<(ExtraNode<'a>, Span)>,
) -> Metadata<'a> {
Metadata {
span: old_metadata.span,
extra_nodes: new_nodes,
}
}
pub fn token<'a, I>(token_to_match: Token<'a>) -> impl Parser<'a, I, Metadata<'a>, ParserError<'a>>
where
I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
{
just(token_to_match)
.map_with(|_, e| Metadata {
span: convert_span(e.span()),
extra_nodes: Vec::default(),
})
.then(extra_node_parser())
.map(|(a, b)| replace_nodes(a, b))
}
pub fn todo_parser<'a, I>() -> impl Parser<'a, I, (), ParserError<'a>>
where
I: ValueInput<'a, Token = Token<'a>, Span = ParserSpan>,
{
just(Token::Error).to(())
}