Skip to content

Commit 8c79680

Browse files
committed
Correct variable naming to express the loop functionality
of the two iterators in the `lightning-invoice/src/utils.rs` file
1 parent ed712a7 commit 8c79680

File tree

1 file changed

+29
-31
lines changed

1 file changed

+29
-31
lines changed

lightning-invoice/src/utils.rs

+29-31
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)