use crate::*;
use std::ops::Range;
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct One<T> {
val: T,
}
impl<T> One<T> {
#[inline]
pub const fn new(val: T) -> Self {
Self { val }
}
}
impl<I: TimeTravel, T> Parser<I> for One<T>
where
I::Item: PartialEq<T>,
{
type Output = Range<usize>;
fn parse(&self, mut input: I) -> Option<Self::Output> {
let from = input.save();
let a = input.next()?;
input.do_ready();
if PartialEq::<T>::eq(&a, &self.val) {
Some(input.make_range(from))
} else {
None
}
}
}
#[inline]
pub const fn one<T>(val: T) -> One<T> {
One::new(val)
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn test() {
let code = "asd";
let span = code.span();
let a = one('a');
let r = a.parse(span);
println!("{:?}", r);
assert_eq!(r, Some(0..1))
}
#[test]
fn test_none() {
let code = "asd";
let span = code.span();
let a = one('b');
let r = a.parse(span);
println!("{:?}", r);
assert_eq!(r, None)
}
#[test]
fn test_empty() {
let code = "";
let span = code.span();
let a = one('a');
let r = a.parse(span);
println!("{:?}", r);
assert_eq!(r, None)
}
#[test]
fn test_multi() {
let code = "asd";
let span = code.span();
let a = one('a');
let b = one('s');
let r = a.parse(span.ref_clone());
println!("{:?}", r);
assert_eq!(r, Some(0..1));
let r = b.parse(span);
println!("{:?}", r);
assert_eq!(r, Some(1..2));
}
}