summary refs log tree commit diff stats
path: root/src/vm.rs
diff options
context:
space:
mode:
authorSoniEx2 <endermoneymod@gmail.com>2021-01-13 11:20:21 -0300
committerSoniEx2 <endermoneymod@gmail.com>2021-01-13 11:20:21 -0300
commitd26db33422b720822b9b24b99ddadc3ffd36d752 (patch)
tree4e43c3bfb1a20f7c8828bdf5c7bcd9b87c81729c /src/vm.rs
parentbcdba3431c72cd0804d9a95972a907b828fb5fad (diff)
Finalize Holder design (hopefully)
Diffstat (limited to 'src/vm.rs')
-rw-r--r--src/vm.rs18
1 files changed, 11 insertions, 7 deletions
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<T: PatternTypes> {
     pub(crate) strings: Vec<String>,
     pub(crate) regices: Vec<()/* TODO */>,
     pub(crate) predicates: Vec<Box<Predicate<T>>>,
+    // 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<T::Value>,
 }
 
 /// 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<dyn Iterator<Item=Result<HolderState<'a, 'b, T>, MatchError>> + Capture<'a> + Capture<'b>>,
-     iterator: Box<dyn FnMut() -> Option<Result<HolderState<'a, 'b, T>, MatchError>>>,
-     //iterator: T::Iter,
+     iterator: Box<dyn Iterator<Item=(&'b T::Value, &'b T::Value)> + 'b>,
+     filters: Vec<Box<dyn for<'c> Fn(&'c mut HolderState<'a, 'b, T>) + 'a>>,
 }
 
 impl<'a, 'b, T: PatternTypes> Holder<'a, 'b, T> {
     fn next(&mut self) -> Option<Result<(), MatchError>> {
         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(),
         }
     }
 }