#[cfg(debug_assertions)]
use crate::events::is_event_of;
use crate::{internal_utils::array_queue::ArrayQueue, types::Stack, types::Tym, Event};
use super::{
stack_wrapper::{StackEntry, StackWrapper},
types::YieldContext,
};
const MAX_TO_YIELD: usize = 4;
pub struct ParserInner<TStack: Stack<StackEntry>> {
pub stack: StackWrapper<TStack>,
to_yield: ArrayQueue<MAX_TO_YIELD, Event>,
pub to_skip_input: ToSkipInputEvents,
pub to_exit_until_popped_entry_from_stack: Option<StackEntry>,
}
impl<TStack: Stack<StackEntry>> ParserInner<TStack> {
pub fn new() -> Self {
Self {
stack: StackWrapper::new(),
to_yield: ArrayQueue::new(),
to_skip_input: ToSkipInputEvents::default(),
to_exit_until_popped_entry_from_stack: None,
}
}
pub fn enforce_to_yield_mark(&self, _: Tym<MAX_TO_YIELD>) {}
pub fn pop_to_be_yielded(&mut self) -> Option<Event> {
self.to_yield.pop_front()
}
}
impl<TStack: Stack<StackEntry>> YieldContext for ParserInner<TStack> {
#[must_use]
fn r#yield(&mut self, ev: Event) -> Tym<1> {
#[cfg(debug_assertions)]
debug_assert!(is_event_of!(Inline, ev));
self.to_yield.push_back(ev);
Tym::<1>::new()
}
}
#[derive(Default)]
pub struct ToSkipInputEvents {
pub count: usize,
pub cursor_value: Option<usize>,
}
impl ToSkipInputEvents {
pub fn new_one() -> Self {
Self {
count: 1,
cursor_value: None,
}
}
}