From bb1cfc76d985cb96e0561c3b5b197f286d8f6398 Mon Sep 17 00:00:00 2001 From: Ellen Emilia Anna Zscheile Date: Mon, 31 Mar 2025 01:34:12 +0200 Subject: [PATCH] fix(planar-incr-embed): discover all possible paths, including the variants re: weak entries --- crates/planar-incr-embed/src/planarr/mod.rs | 38 ++++++++++--------- ...ar_incr_embed__planarr__tests__weak00.snap | 27 +++++++++++++ crates/planar-incr-embed/src/planarr/tests.rs | 17 +++++++++ 3 files changed, 65 insertions(+), 17 deletions(-) create mode 100644 crates/planar-incr-embed/src/planarr/snapshots/planar_incr_embed__planarr__tests__weak00.snap diff --git a/crates/planar-incr-embed/src/planarr/mod.rs b/crates/planar-incr-embed/src/planarr/mod.rs index 37b8507..cb08ad4 100644 --- a/crates/planar-incr-embed/src/planarr/mod.rs +++ b/crates/planar-incr-embed/src/planarr/mod.rs @@ -180,25 +180,29 @@ where // 2. handle rest Some(( start_idx, - it.filter_map(move |(section_idx, (ni, eps))| { + it.flat_map(move |(section_idx, (ni, eps))| { // find possible insertion point // (at most one of `eps.len()+1` positions) - let mut pos = if stack.is_empty() { Some(0) } else { None }; - for (n, i) in eps.iter().enumerate() { - handle_lifo_relaxed(&mut stack, i); - if pos.is_none() && stack.is_empty() { - pos = Some(n + 1); - } - } - pos.map(|insert_pos| { - ( - ni, - OtherEnd { - section_idx, - insert_pos, - }, - ) - }) + (if stack.is_empty() { Some(0) } else { None }) + .into_iter() + .chain(eps.iter().enumerate().filter_map(|(n, i)| { + handle_lifo_relaxed(&mut stack, i); + if stack.is_empty() { + Some(n + 1) + } else { + None + } + })) + .map(move |insert_pos| { + ( + ni.clone(), + OtherEnd { + section_idx, + insert_pos, + }, + ) + }) + .collect::>() }), )) } diff --git a/crates/planar-incr-embed/src/planarr/snapshots/planar_incr_embed__planarr__tests__weak00.snap b/crates/planar-incr-embed/src/planarr/snapshots/planar_incr_embed__planarr__tests__weak00.snap new file mode 100644 index 0000000..88c70c2 --- /dev/null +++ b/crates/planar-incr-embed/src/planarr/snapshots/planar_incr_embed__planarr__tests__weak00.snap @@ -0,0 +1,27 @@ +--- +source: crates/planar-incr-embed/src/planarr/tests.rs +expression: "s_.find_all_other_ends(&0, 0, false).unwrap().1.collect::>()" +--- +[ + [ + 1, + { + "section_idx": 1, + "insert_pos": 2 + } + ], + [ + 2, + { + "section_idx": 2, + "insert_pos": 0 + } + ], + [ + 2, + { + "section_idx": 2, + "insert_pos": 1 + } + ] +] diff --git a/crates/planar-incr-embed/src/planarr/tests.rs b/crates/planar-incr-embed/src/planarr/tests.rs index 4df1bbd..730be77 100644 --- a/crates/planar-incr-embed/src/planarr/tests.rs +++ b/crates/planar-incr-embed/src/planarr/tests.rs @@ -148,3 +148,20 @@ fn simple01() { assert_eq!(s_.insert_path(&1, 2, &2, 'd'), Ok(1)); assert_compact_json_snapshot!(s.0); } + +#[test] +fn weak00() { + let mut s = PlanarArrangement::<_, _, ()>::from_node_indices(0..3); + let mut s_ = s.as_mut(); + s_.0[2].1.reversed = true; + s_.0[2].1.with_borrow_mut(|j| { + j.inner.push(RelaxedPath::Weak(())); + }); + assert_eq!(s_.insert_path(&0, 0, &1, 'a'), Ok(0)); + assert_eq!(s_.insert_path(&0, 0, &1, 'b'), Ok(0)); + assert_compact_json_snapshot!(s_ + .find_all_other_ends(&0, 0, false) + .unwrap() + .1 + .collect::>()); +}