use crate::core::Parser;
use crate::extension::parsers::CacheParsers;
use crate::internal::ParsersImpl;
use std::cell::RefCell;
use crate::core::ParseResult;
use fnv::FnvHashMap;
use std::fmt::Debug;
use std::ptr;
impl CacheParsers for ParsersImpl {
#[inline]
fn cache<'a, I, A>(parser: Self::P<'a, I, A>) -> Self::P<'a, I, A>
where
I: Clone + 'a,
A: Clone + Debug + 'a, {
let caches = RefCell::new(FnvHashMap::<(usize, usize, usize), ParseResult<'a, I, A>>::default());
let method = parser.method.clone();
Parser::new(move |parser_state| {
let key = (
parser_state as *const _ as usize,
parser_state.last_offset().unwrap_or(0),
ptr::addr_of!(method) as usize,
);
let parse_result = caches
.borrow_mut()
.entry(key)
.or_insert_with(|| method(parser_state))
.clone();
parse_result
})
}
}