use std::{fmt::Debug, marker::PhantomData};
use crate::{wrapper::*, Result};
#[allow(clippy::needless_doctest_main)]
pub trait Parser: Sized + Copy {
type Output;
fn p_arse<'a>(&self, tail: &'a str) -> Result<'a, Self::Output>;
fn map<F, U>(self, f: F) -> Map<Self, F, U>
where
F: Fn(Self::Output) -> U + Copy,
{
Map {
parser: self,
marker: PhantomData,
f,
}
}
fn ignore(self) -> Ignorant<Self> {
Ignorant { parser: self }
}
fn or<P>(self, other: P) -> Or<Self, P>
where
P: Parser<Output = Self::Output>,
{
Or {
parser_0: self,
parser_1: other,
}
}
fn opt(self) -> Opt<Self> {
Opt { parser: self }
}
fn zore(self) -> ZeroOrMore<Self> {
ZeroOrMore { parser: self }
}
fn more(self) -> OneOrMore<Self> {
OneOrMore { parser: self }
}
fn not_ahead(self) -> NegativeLookahead<Self> {
NegativeLookahead { parser: self }
}
fn ahead(self) -> PositiveLookahead<Self> {
PositiveLookahead { parser: self }
}
fn named(self, name: &'static str) -> Named<Self> {
Named { parser: self, name }
}
fn maps<F, T>(self, f: F) -> MapStr<Self, F, T>
where
F: Fn(&str) -> T + Copy,
{
MapStr { parser: self, f }
}
fn dbg(self) -> Debugged<Self>
where
Self::Output: Debug,
{
Debugged { parser: self }
}
}