From d26db33422b720822b9b24b99ddadc3ffd36d752 Mon Sep 17 00:00:00 2001 From: SoniEx2 Date: Wed, 13 Jan 2021 11:20:21 -0300 Subject: Finalize Holder design (hopefully) --- src/vm.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/vm.rs') diff --git a/src/vm.rs b/src/vm.rs index 3131571..595fac1 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -19,6 +19,10 @@ pub(crate) struct PatternConstants { pub(crate) strings: Vec, pub(crate) regices: Vec<()/* TODO */>, pub(crate) predicates: Vec>>, + // NOTE these are part of the constant pool and so have lifetime analogous + // to 'a (consistently used to indicate constant pool lifetime) when used + // elsewhere. In particular, they can't be yielded by the iterator. + pub(crate) defs: Vec, } /// A pattern element. @@ -132,18 +136,16 @@ struct Holder<'a, 'b, T: PatternTypes> { name: Option<&'a str>, value: HolderState<'a, 'b, T>, parent: Option<&'b T::Value>, - //iterator: Box, MatchError>> + Capture<'a> + Capture<'b>>, - iterator: Box Option, MatchError>>>, - //iterator: T::Iter, + iterator: Box + 'b>, + filters: Vec Fn(&'c mut HolderState<'a, 'b, T>) + 'a>>, } impl<'a, 'b, T: PatternTypes> Holder<'a, 'b, T> { fn next(&mut self) -> Option> { if let Self { value: ref mut v, iterator: ref mut it, .. } = self { let is_subtree = v.is_subtree(); - *v = match it() { - Some(Ok(pair)) => pair, - Some(Err(e)) => return Some(Err(e)), + *v = match it.next() { + Some(pair) => HolderState::Key(pair), None => return None }; // just try to make sure the type doesn't change. @@ -160,7 +162,9 @@ impl<'a, 'b, T: PatternTypes> Default for Holder<'a, 'b, T> { name: Default::default(), value: HolderState::EmptyKey, parent: Default::default(), - iterator: Box::new(|| None), + // TODO https://github.com/rust-lang/rfcs/issues/3059 + iterator: Box::new(std::iter::empty()), + filters: Default::default(), } } } -- cgit 1.4.1