udled 0.6.2

Tokenizer and parser
Documentation
use core::marker::PhantomData;

use crate::{Buffer, Error, Reader, Tokenizer};

pub trait IntoTokenizer<'a, B>
where
    B: Buffer<'a>,
{
    type Tokenizer: Tokenizer<'a, B>;

    fn into_tokenizer(self) -> Self::Tokenizer;
}

impl<'a, T, U, B> IntoTokenizer<'a, B> for T
where
    T: Fn(&mut Reader<'_, 'a, B>) -> Result<U, Error>,
    B: Buffer<'a>,
{
    type Tokenizer = Func<T, U>;

    fn into_tokenizer(self) -> Self::Tokenizer {
        Func(self, PhantomData)
    }
}

pub struct Func<T, U>(T, PhantomData<U>);

impl<T, U> Func<T, U> {
    pub const fn new(func: T) -> Func<T, U> {
        Func(func, PhantomData)
    }
}

impl<T, U> Clone for Func<T, U>
where
    T: Clone,
{
    fn clone(&self) -> Self {
        Func(self.0.clone(), PhantomData)
    }
}

impl<T, U> Copy for Func<T, U> where T: Copy {}

impl<'input, T, U, B> Tokenizer<'input, B> for Func<T, U>
where
    B: Buffer<'input>,
    for<'a> T: Fn(&mut Reader<'a, 'input, B>) -> Result<U, Error>,
{
    type Token = U;

    fn to_token(&self, reader: &mut Reader<'_, 'input, B>) -> Result<Self::Token, Error> {
        (self.0)(reader)
    }
}