@@ -250,16 +250,18 @@ where
250250 } ;
251251
252252 let mut maybe_cyclic_path = None ;
253- let mut appendages = self . appendages ;
253+ let mut remaining_appendages = self . appendages ;
254+ let mut prefix_appendages = Vec :: new ( ) ;
254255 loop {
255- // get prefix elements
256- let mut prefix_appendages = List :: empty ( ) ;
256+ // find cycle length
257+ let mut counting_appendages = remaining_appendages;
258+ let mut cycle_length = 0usize ;
257259 loop {
258- let appendable = appendages . pop_front ( & mut appendables. elements ) . cloned ( ) ;
260+ let appendable = counting_appendages . pop_front ( & mut appendables. elements ) ;
259261 match appendable {
260262 Some ( appendage) => {
263+ cycle_length += 1 ;
261264 let is_cycle = appendage. start_node ( db, & appendables. interned ) == end_node;
262- prefix_appendages. push_front ( & mut appendables. elements , appendage) ;
263265 if is_cycle {
264266 break ;
265267 }
@@ -268,9 +270,20 @@ where
268270 }
269271 }
270272
273+ // collect prefix elements
274+ prefix_appendages. clear ( ) ;
275+ prefix_appendages. reserve ( cycle_length) ;
276+ for _ in 0 ..cycle_length {
277+ let appendable = remaining_appendages
278+ . pop_front ( & mut appendables. elements )
279+ . expect ( "" )
280+ . clone ( ) ;
281+ prefix_appendages. push ( appendable) ;
282+ }
283+
271284 // build prefix path -- prefix starts at end_node, because this is a cycle
272285 let mut prefix_path = PartialPath :: from_node ( graph, partials, end_node) ;
273- while let Some ( appendage) = prefix_appendages. pop_front ( & mut appendables . elements ) {
286+ while let Some ( appendage) = prefix_appendages. pop ( ) {
274287 appendage. append_to (
275288 graph,
276289 partials,
0 commit comments