From caa20c35705032db6bdc945e101a8216ea515cb9 Mon Sep 17 00:00:00 2001 From: elvis Date: Sun, 22 Jun 2025 19:37:57 +0200 Subject: [PATCH] More idiomatic code --- src/rsprocess/confluence.rs | 90 +++++++++++++++---------------------- 1 file changed, 35 insertions(+), 55 deletions(-) diff --git a/src/rsprocess/confluence.rs b/src/rsprocess/confluence.rs index d44a25d..6a459ec 100644 --- a/src/rsprocess/confluence.rs +++ b/src/rsprocess/confluence.rs @@ -1,7 +1,13 @@ #![allow(dead_code)] use super::perpetual::{ - lollipops_decomposed_named, lollipops_named, lollipops_only_loop_decomposed, lollipops_only_loop_decomposed_named, lollipops_prefix_len_loop_decomposed, lollipops_prefix_len_loop_decomposed_named}; + lollipops_decomposed_named, + lollipops_named, + lollipops_only_loop_decomposed, + lollipops_only_loop_decomposed_named, + lollipops_prefix_len_loop_decomposed, + lollipops_prefix_len_loop_decomposed_named +}; use super::structure::{RSenvironment, RSreaction, RSset}; use super::translator::IdType; use std::cmp; @@ -13,37 +19,26 @@ pub fn confluent( reaction_rules: &[RSreaction], entities: &[RSset], ) -> Option<(usize, usize, Vec)> { - let mut max_distance = 0; - let mut dimension = 0; - let mut hoop = vec![]; - if let Some(el) = entities.first() { - if let Some(new_hoop) = lollipops_only_loop_decomposed(delta, - reaction_rules, - el).first() - { - dimension = new_hoop.len(); - hoop = new_hoop.clone(); - } - } + let all_loops = lollipops_prefix_len_loop_decomposed(delta, + reaction_rules, + entities.first()?); + let (prefix_len, hoop) = all_loops.first()?.clone(); + let dimension = hoop.len(); + let mut max_distance = prefix_len; for available_entities in entities.iter().skip(1) { + let all_loops = lollipops_prefix_len_loop_decomposed(delta, + reaction_rules, + available_entities); // FIXME we take just the first? do we compare all? - if let Some((prefix_len, new_hoop)) = - lollipops_prefix_len_loop_decomposed(delta, - reaction_rules, - available_entities).first() - { - if new_hoop.len() != dimension || !hoop.contains(new_hoop - .first() - .unwrap()) - { - return None; - } - max_distance = cmp::max(max_distance, *prefix_len); - } else { + let (prefix_len, new_hoop) = all_loops.first()?; + + if new_hoop.len() != dimension + || !hoop.contains(new_hoop.first().unwrap()) { return None; } + max_distance = cmp::max(max_distance, *prefix_len); } Some((max_distance, dimension, hoop)) } @@ -56,42 +51,27 @@ pub fn confluent_named( entities: &[RSset], symb: IdType ) -> Option<(usize, usize, Vec)> { - let mut max_distance = 0; - let mut dimension = 0; - let mut hoop = vec![]; - - if let Some(el) = entities.first() { - if let Some(new_hoop) = - lollipops_only_loop_decomposed_named(delta, - reaction_rules, - el, - symb) - { - dimension = new_hoop.len(); - hoop = new_hoop.clone(); - } else { - return None - } - } + let (prefix_len, first_hoop) = + lollipops_prefix_len_loop_decomposed_named(delta, + reaction_rules, + entities.first()?, + symb)?; + let dimension = first_hoop.len(); + let mut max_distance = prefix_len; + let hoop = first_hoop; for available_entities in entities.iter().skip(1) { - // FIXME we take just the first? do we compare all? - if let Some((prefix_len, new_hoop)) = + let (prefix_len, new_hoop) = lollipops_prefix_len_loop_decomposed_named(delta, reaction_rules, available_entities, - symb) - { - if new_hoop.len() != dimension || !hoop.contains(new_hoop - .first() - .unwrap()) - { - return None; - } - max_distance = cmp::max(max_distance, prefix_len); - } else { + symb)?; + + if new_hoop.len() != dimension + || !hoop.contains(new_hoop.first().unwrap()) { return None; } + max_distance = cmp::max(max_distance, prefix_len); } Some((max_distance, dimension, hoop)) }