@@ -276,37 +276,36 @@ where
276276 } ) ;
277277
278278 phantom_hints. push ( route_hints) ;
279-
280279 }
281280
282281 // We have one vector per real node involved in creating the phantom invoice. To distribute
283282 // the hints across our real nodes we add one hint from each in turn until no node has any hints
284283 // left (if one node has more hints than any other, these will accumulate at the end of the
285284 // vector).
286- rotate_nested_vectors ( phantom_hints)
285+ rotate_through_iterators ( phantom_hints)
287286}
288287
289- /// Draw items iteratively from multiple nested vectors . The items are retrieved by index and
290- /// rotates through the vectors - first the zero index then the first index then second index, etc.
291- fn rotate_nested_vectors < T , I : Iterator < Item = T > > ( mut vecs : Vec < I > ) -> impl Iterator < Item = T > {
292- let mut idx = 0 ;
288+ /// Draw items iteratively from multiple iterators . The items are retrieved by index and
289+ /// rotates through the iterators - first the zero index then the first index then second index, etc.
290+ fn rotate_through_iterators < T , I : Iterator < Item = T > > ( mut vecs : Vec < I > ) -> impl Iterator < Item = T > {
291+ let mut iterations = 0 ;
293292
294293 core:: iter:: from_fn ( move || {
295- let mut exhausted_vectors = 0 ;
294+ let mut exhausted_iterators = 0 ;
296295 loop {
297296 if vecs. is_empty ( ) {
298297 return None ;
299298 }
300- let next_idx = idx % vecs. len ( ) ;
301- let hint_opt = vecs[ next_idx] . next ( ) ;
302- idx += 1 ;
303- if let Some ( hint) = hint_opt {
304- return Some ( hint) ;
299+ let next_idx = iterations % vecs. len ( ) ;
300+ iterations += 1 ;
301+ if let Some ( item) = vecs[ next_idx] . next ( ) {
302+ return Some ( item) ;
305303 }
306304 // exhausted_vectors increase when the "next_idx" vector is exhausted
307- exhausted_vectors += 1 ;
308- // return None when all of the nested vectors are exhausted
309- if exhausted_vectors > vecs. len ( ) {
305+ exhausted_iterators += 1 ;
306+ // The check for exhausted iterators gets reset to 0 after each yield of `Some()`
307+ // The lop will return None when all of the nested iterators are exhausted
308+ if exhausted_iterators == vecs. len ( ) {
310309 return None ;
311310 }
312311 }
@@ -805,7 +804,7 @@ mod test {
805804 use lightning:: routing:: router:: { PaymentParameters , RouteParameters } ;
806805 use lightning:: util:: test_utils;
807806 use lightning:: util:: config:: UserConfig ;
808- use crate :: utils:: { create_invoice_from_channelmanager_and_duration_since_epoch, rotate_nested_vectors } ;
807+ use crate :: utils:: { create_invoice_from_channelmanager_and_duration_since_epoch, rotate_through_iterators } ;
809808 use std:: collections:: HashSet ;
810809
811810 #[ test]
@@ -1915,61 +1914,60 @@ mod test {
19151914 }
19161915 }
19171916
1918-
19191917 #[ test]
1920- fn test_zip_nested_vectors ( ) {
1918+ fn test_rotate_through_iterators ( ) {
19211919 // two nested vectors
19221920 let a = vec ! [ vec![ "a0" , "b0" , "c0" ] . into_iter( ) , vec![ "a1" , "b1" ] . into_iter( ) ] ;
1923- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1921+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19241922
19251923 let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
19261924 assert_eq ! ( expected, result) ;
19271925
19281926 // test single nested vector
19291927 let a = vec ! [ vec![ "a0" , "b0" , "c0" ] . into_iter( ) ] ;
1930- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1928+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19311929
19321930 let expected = vec ! [ "a0" , "b0" , "c0" ] ;
19331931 assert_eq ! ( expected, result) ;
19341932
19351933 // test second vector with only one element
19361934 let a = vec ! [ vec![ "a0" , "b0" , "c0" ] . into_iter( ) , vec![ "a1" ] . into_iter( ) ] ;
1937- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1935+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19381936
19391937 let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
19401938 assert_eq ! ( expected, result) ;
19411939
19421940 // test three nestend vectors
19431941 let a = vec ! [ vec![ "a0" ] . into_iter( ) , vec![ "a1" , "b1" , "c1" ] . into_iter( ) , vec![ "a2" ] . into_iter( ) ] ;
1944- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1942+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19451943
19461944 let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
19471945 assert_eq ! ( expected, result) ;
19481946
19491947 // test single nested vector with a single value
19501948 let a = vec ! [ vec![ "a0" ] . into_iter( ) ] ;
1951- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1949+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19521950
19531951 let expected = vec ! [ "a0" ] ;
19541952 assert_eq ! ( expected, result) ;
19551953
19561954 // test single empty nested vector
19571955 let a: Vec < std:: vec:: IntoIter < & str > > = vec ! [ vec![ ] . into_iter( ) ] ;
1958- let result = rotate_nested_vectors ( a) . collect :: < Vec < & str > > ( ) ;
1956+ let result = rotate_through_iterators ( a) . collect :: < Vec < & str > > ( ) ;
19591957 let expected: Vec < & str > = vec ! [ ] ;
19601958
19611959 assert_eq ! ( expected, result) ;
19621960
19631961 // test first nested vector is empty
19641962 let a: Vec < std:: vec:: IntoIter < & str > > = vec ! [ vec![ ] . into_iter( ) , vec![ "a1" , "b1" , "c1" ] . into_iter( ) ] ;
1965- let result = rotate_nested_vectors ( a) . collect :: < Vec < & str > > ( ) ;
1963+ let result = rotate_through_iterators ( a) . collect :: < Vec < & str > > ( ) ;
19661964
19671965 let expected = vec ! [ "a1" , "b1" , "c1" ] ;
19681966 assert_eq ! ( expected, result) ;
19691967
19701968 // test two empty vectors
19711969 let a: Vec < std:: vec:: IntoIter < & str > > = vec ! [ vec![ ] . into_iter( ) , vec![ ] . into_iter( ) ] ;
1972- let result = rotate_nested_vectors ( a) . collect :: < Vec < & str > > ( ) ;
1970+ let result = rotate_through_iterators ( a) . collect :: < Vec < & str > > ( ) ;
19731971
19741972 let expected: Vec < & str > = vec ! [ ] ;
19751973 assert_eq ! ( expected, result) ;
@@ -1981,21 +1979,21 @@ mod test {
19811979 vec![ "a1" , "b1" , "c1" ] . into_iter( ) ,
19821980 vec![ "a2" , "b2" , "c2" ] . into_iter( ) ,
19831981 ] ;
1984- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1982+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19851983
19861984 let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
19871985 assert_eq ! ( expected, result) ;
19881986
19891987 // test a filled vector between two empty vectors
19901988 let a = vec ! [ vec![ ] . into_iter( ) , vec![ "a1" , "b1" , "c1" ] . into_iter( ) , vec![ ] . into_iter( ) ] ;
1991- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1989+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19921990
19931991 let expected = vec ! [ "a1" , "b1" , "c1" ] ;
19941992 assert_eq ! ( expected, result) ;
19951993
19961994 // test an empty vector at the end of the vectors
19971995 let a = vec ! [ vec![ "a0" , "b0" , "c0" ] . into_iter( ) , vec![ ] . into_iter( ) ] ;
1998- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1996+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
19991997
20001998 let expected = vec ! [ "a0" , "b0" , "c0" ] ;
20011999 assert_eq ! ( expected, result) ;
@@ -2009,15 +2007,15 @@ mod test {
20092007 vec![ ] . into_iter( ) ,
20102008 ] ;
20112009
2012- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2010+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
20132011
20142012 let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
20152013 assert_eq ! ( expected, result) ;
20162014
20172015 // test one element in the first nested vectore and two elements in the second nested
20182016 // vector
20192017 let a = vec ! [ vec![ "a0" ] . into_iter( ) , vec![ "a1" , "b1" ] . into_iter( ) ] ;
2020- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2018+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
20212019
20222020 let expected = vec ! [ "a0" , "a1" , "b1" ] ;
20232021 assert_eq ! ( expected, result) ;
0 commit comments