@@ -276,37 +276,36 @@ where
276
276
} ) ;
277
277
278
278
phantom_hints. push ( route_hints) ;
279
-
280
279
}
281
280
282
281
// We have one vector per real node involved in creating the phantom invoice. To distribute
283
282
// the hints across our real nodes we add one hint from each in turn until no node has any hints
284
283
// left (if one node has more hints than any other, these will accumulate at the end of the
285
284
// vector).
286
- rotate_nested_vectors ( phantom_hints)
285
+ rotate_through_iterators ( phantom_hints)
287
286
}
288
287
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 ;
293
292
294
293
core:: iter:: from_fn ( move || {
295
- let mut exhausted_vectors = 0 ;
294
+ let mut exhausted_iterators = 0 ;
296
295
loop {
297
296
if vecs. is_empty ( ) {
298
297
return None ;
299
298
}
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) ;
305
303
}
306
304
// 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 ( ) {
310
309
return None ;
311
310
}
312
311
}
@@ -805,7 +804,7 @@ mod test {
805
804
use lightning:: routing:: router:: { PaymentParameters , RouteParameters } ;
806
805
use lightning:: util:: test_utils;
807
806
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 } ;
809
808
use std:: collections:: HashSet ;
810
809
811
810
#[ test]
@@ -1915,61 +1914,60 @@ mod test {
1915
1914
}
1916
1915
}
1917
1916
1918
-
1919
1917
#[ test]
1920
- fn test_zip_nested_vectors ( ) {
1918
+ fn test_rotate_through_iterators ( ) {
1921
1919
// two nested vectors
1922
1920
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 < _ > > ( ) ;
1924
1922
1925
1923
let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
1926
1924
assert_eq ! ( expected, result) ;
1927
1925
1928
1926
// test single nested vector
1929
1927
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 < _ > > ( ) ;
1931
1929
1932
1930
let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1933
1931
assert_eq ! ( expected, result) ;
1934
1932
1935
1933
// test second vector with only one element
1936
1934
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 < _ > > ( ) ;
1938
1936
1939
1937
let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
1940
1938
assert_eq ! ( expected, result) ;
1941
1939
1942
1940
// test three nestend vectors
1943
1941
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 < _ > > ( ) ;
1945
1943
1946
1944
let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
1947
1945
assert_eq ! ( expected, result) ;
1948
1946
1949
1947
// test single nested vector with a single value
1950
1948
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 < _ > > ( ) ;
1952
1950
1953
1951
let expected = vec ! [ "a0" ] ;
1954
1952
assert_eq ! ( expected, result) ;
1955
1953
1956
1954
// test single empty nested vector
1957
1955
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 > > ( ) ;
1959
1957
let expected: Vec < & str > = vec ! [ ] ;
1960
1958
1961
1959
assert_eq ! ( expected, result) ;
1962
1960
1963
1961
// test first nested vector is empty
1964
1962
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 > > ( ) ;
1966
1964
1967
1965
let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1968
1966
assert_eq ! ( expected, result) ;
1969
1967
1970
1968
// test two empty vectors
1971
1969
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 > > ( ) ;
1973
1971
1974
1972
let expected: Vec < & str > = vec ! [ ] ;
1975
1973
assert_eq ! ( expected, result) ;
@@ -1981,21 +1979,21 @@ mod test {
1981
1979
vec![ "a1" , "b1" , "c1" ] . into_iter( ) ,
1982
1980
vec![ "a2" , "b2" , "c2" ] . into_iter( ) ,
1983
1981
] ;
1984
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1982
+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
1985
1983
1986
1984
let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
1987
1985
assert_eq ! ( expected, result) ;
1988
1986
1989
1987
// test a filled vector between two empty vectors
1990
1988
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 < _ > > ( ) ;
1992
1990
1993
1991
let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1994
1992
assert_eq ! ( expected, result) ;
1995
1993
1996
1994
// test an empty vector at the end of the vectors
1997
1995
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 < _ > > ( ) ;
1999
1997
2000
1998
let expected = vec ! [ "a0" , "b0" , "c0" ] ;
2001
1999
assert_eq ! ( expected, result) ;
@@ -2009,15 +2007,15 @@ mod test {
2009
2007
vec![ ] . into_iter( ) ,
2010
2008
] ;
2011
2009
2012
- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2010
+ let result = rotate_through_iterators ( a) . collect :: < Vec < _ > > ( ) ;
2013
2011
2014
2012
let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
2015
2013
assert_eq ! ( expected, result) ;
2016
2014
2017
2015
// test one element in the first nested vectore and two elements in the second nested
2018
2016
// vector
2019
2017
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 < _ > > ( ) ;
2021
2019
2022
2020
let expected = vec ! [ "a0" , "a1" , "b1" ] ;
2023
2021
assert_eq ! ( expected, result) ;
0 commit comments