From 469e87eaf31c94ffa57381536fe38f08c7341893 Mon Sep 17 00:00:00 2001 From: Glint Dev Date: Fri, 24 Jul 2026 16:47:02 +0300 Subject: [PATCH] phase 7.3: parallel @each using rayon (feature gate, threshold >= 10 items) --- src/interpreter/mod.rs | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index c432a89..adda157 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -427,13 +427,44 @@ impl Interpreter { let child_refs: Vec<&Element<'a>> = el.children.iter().collect(); + #[cfg(feature = "parallel")] + if items.len() >= 10 { + use rayon::prelude::*; + let var_name_owned = var_name.to_string(); + let vars_snapshot = variables.clone(); + let results: Vec>> = items + .par_iter() + .map(|item| { + let mut local_vars = vars_snapshot.clone(); + local_vars.insert(var_name_owned.clone(), Value::Str(CompactString::new(item))); + Self::evaluate_vdom_incr( + &child_refs, &mut local_vars, components, rhei, stylesheet, ancestors, dirty_set, + ) + }) + .collect(); + for result in results { + output.extend(result); + } + } else { + for item in items { + let old_val = variables.insert(var_name.to_string(), Value::Str(CompactString::new(item))); + output.extend(Self::evaluate_vdom_incr( + &child_refs, variables, components, rhei, stylesheet, ancestors, dirty_set, + )); + if let Some(old) = old_val { + variables.insert(var_name.to_string(), old); + } else { + variables.remove(var_name); + } + } + } + + #[cfg(not(feature = "parallel"))] for item in items { let old_val = variables.insert(var_name.to_string(), Value::Str(CompactString::new(item))); - output.extend(Self::evaluate_vdom_incr( &child_refs, variables, components, rhei, stylesheet, ancestors, dirty_set, )); - if let Some(old) = old_val { variables.insert(var_name.to_string(), old); } else {