From c2594ab6dc1ef22282896b8110492ca003f108a8 Mon Sep 17 00:00:00 2001 From: mark Date: Sat, 27 May 2023 19:37:01 +0200 Subject: [PATCH] . --- mers/src/lang/code_runnable.rs | 37 ++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/mers/src/lang/code_runnable.rs b/mers/src/lang/code_runnable.rs index 6f0a484..c5c8492 100755 --- a/mers/src/lang/code_runnable.rs +++ b/mers/src/lang/code_runnable.rs @@ -215,12 +215,12 @@ impl RStatementEnum { Self::For(v, c, b) => { // matching values also break with value from a for loop. let vv = v.run(info); - c.run(info).operate_on_data_immut(|c: &VDataEnum| { - let mut in_loop = |c: VData| { - c.assign_to(vv.clone_mut(), info); - b.run(info) - }; - + let mut in_loop = |c: VData| { + c.assign_to(vv.clone_mut(), info); + b.run(info) + }; + let mut iter = c.run(info); + if let Some(v) = iter.operate_on_data_immut(|c: &VDataEnum| { let mut oval = VDataEnum::Tuple(vec![]).to(); match c { VDataEnum::Int(v) => { @@ -259,10 +259,31 @@ impl RStatementEnum { break; } }, + VDataEnum::Reference(r) => return None, _ => unreachable!(), } - oval - }) + Some(oval) + }) { + v + } else { + // loop mutably + iter.operate_on_data_mut(|c| match c { + VDataEnum::Reference(r) => r.operate_on_data_mut(|c| match c { + VDataEnum::Tuple(v) | VDataEnum::List(_, v) => { + for v in v { + if let Some(v) = + in_loop(VDataEnum::Reference(v.clone_mut()).to()).matches() + { + return v; + } + } + VDataEnum::Tuple(vec![]).to() + } + _ => unreachable!(), + }), + _ => unreachable!(), + }) + } } Self::Switch(switch_on, cases, _force) => { let switch_on = switch_on.run(info);