tsv: &str, ) -> Result> { let mut needles = Vec::new(); for (i, line) in tsv.lines().enumerate() { if line.is_empty() || line.starts_with('#') { continue; } if let Some(value) = line.split('\t').next() { let sat = Sat::from_str(value).map_err(|err| { anyhow!( "failed to parse sat from string \"{value}\" on line {}: {err}", i + 1, ) })?; needles.push((sat, value)); } } needles.sort(); let mut haystacks = utxos .into_iter() .flat_map(|(outpoint, ranges)| { ranges .into_iter() .map(move |(start, end)| (start, end, outpoint)) }) .collect::>(); haystacks.sort(); let mut i = 0; let mut j = 0; let mut results = Vec::new(); while i < needles.len() && j < haystacks.len() { let (needle, value) = needles[i]; let (start, end, outpoint) = haystacks[j]; if needle >= start && needle < end { results.push((outpoint, value));