// 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 { 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 where Input: StreamOnce, { _cmp: C, _marker: PhantomData, } impl Parser for TokensCmp 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()) } }