use super::token::Token;
use crate::element::ElementKind;
pub(crate) fn mark(tokens: &mut [Token], idx: usize, kind: ElementKind) {
if let Some(token) = tokens.get_mut(idx) {
token.element_kind = Some(kind);
}
}
pub(crate) fn find_prev_token(
tokens: &[Token],
from: usize,
pred: impl Fn(&Token) -> bool,
) -> Option<usize> {
tokens.get(..from)?.iter().rposition(pred)
}
pub(crate) fn find_next_token(
tokens: &[Token],
from: usize,
pred: impl Fn(&Token) -> bool,
) -> Option<usize> {
let start = from.checked_add(1)?;
let index_in_tail = tokens.get(start..)?.iter().position(pred)?;
Some(start + index_in_tail)
}
pub(crate) fn find_from(tokens: &[Token], start: usize, pred: impl Fn(&Token) -> bool) -> usize {
tokens
.get(start..)
.and_then(|s| s.iter().position(pred))
.map_or(tokens.len(), |i| start + i)
}