52 lines
962 B
Rust
52 lines
962 B
Rust
//@ build-pass
|
|
//@ compile-flags: --crate-type=lib
|
|
|
|
use std::marker::PhantomData;
|
|
|
|
pub trait StreamOnce {
|
|
type Token;
|
|
}
|
|
|
|
impl StreamOnce for &str {
|
|
type Token = ();
|
|
}
|
|
|
|
pub trait Parser<Input: StreamOnce> {
|
|
type PartialState: Default;
|
|
fn parse_mode(&self, _state: &Self::PartialState) {}
|
|
fn parse_mode_impl() {}
|
|
}
|
|
|
|
pub fn parse_bool<'a>() -> impl Parser<&'a str> {
|
|
pub struct TokensCmp<C, Input>
|
|
where
|
|
Input: StreamOnce,
|
|
{
|
|
_cmp: C,
|
|
_marker: PhantomData<Input>,
|
|
}
|
|
|
|
impl<Input, C> Parser<Input> for TokensCmp<C, Input>
|
|
where
|
|
C: FnMut(Input::Token),
|
|
Input: StreamOnce,
|
|
{
|
|
type PartialState = ();
|
|
}
|
|
|
|
TokensCmp { _cmp: |_| (), _marker: PhantomData }
|
|
}
|
|
|
|
pub struct ParseBool;
|
|
|
|
impl<'a> Parser<&'a str> for ParseBool
|
|
where
|
|
&'a str: StreamOnce,
|
|
{
|
|
type PartialState = ();
|
|
|
|
fn parse_mode_impl() {
|
|
parse_bool().parse_mode(&Default::default())
|
|
}
|
|
}
|