pub mod cache; pub mod discord; pub mod flaresolverr; pub mod flow_debug; pub mod hoster_proxy; pub mod proxy; pub mod requester; pub mod time; pub fn parse_abbreviated_number(s: &str) -> Option { let s = s.trim(); if s.is_empty() { return None; } let (num_part, suffix) = s .chars() .partition::(|c| c.is_ascii_digit() || *c == '.'); let multiplier = match suffix.trim().to_ascii_uppercase().as_str() { "K" => 1_000.0, "M" => 1_000_000.0, "B" => 1_000_000_000.0, "" => 1.0, _ => return None, }; num_part .parse::() .ok() .map(|n| (n * multiplier) as u32) } #[cfg(not(hottub_single_provider))] pub fn interleave(lists: &[Vec]) -> Vec { let mut result = Vec::new(); if lists.is_empty() { return result; } // Find the maximum length among the lists let max_len = lists.iter().map(|l| l.len()).max().unwrap_or(0); // Interleave elements for i in 0..max_len { for list in lists { if let Some(item) = list.get(i) { result.push(item.clone()); } } } result }