vyre 0.4.0

GPU compute intermediate representation with a standard operation library
Documentation
use super::Token;

pub fn match_tokens(tokens: &[Token], input: &[u8]) -> bool {
    let (mut p, mut i) = (0usize, 0usize);
    let mut star = None;
    let mut retry_input = 0usize;
    while i < input.len() {
        match tokens.get(p) {
            Some(Token::Literal(byte)) if *byte == input[i] => {
                p += 1;
                i += 1;
            }
            Some(Token::Any) => {
                p += 1;
                i += 1;
            }
            Some(Token::Star) => {
                star = Some(p);
                p += 1;
                retry_input = i;
            }
            _ if star.is_some() => {
                p = star.unwrap_or(0) + 1;
                retry_input += 1;
                i = retry_input;
            }
            _ => return false,
        }
    }
    while matches!(tokens.get(p), Some(Token::Star)) {
        p += 1;
    }
    p == tokens.len()
}