move common_elements util into unit
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
aa265f7ca4
commit
bd75ff65c9
2 changed files with 28 additions and 25 deletions
25
src/core/utils/algorithm.rs
Normal file
25
src/core/utils/algorithm.rs
Normal file
|
@ -0,0 +1,25 @@
|
|||
use std::cmp::Ordering;
|
||||
|
||||
#[allow(clippy::impl_trait_in_params)]
|
||||
pub fn common_elements(
|
||||
mut iterators: impl Iterator<Item = impl Iterator<Item = Vec<u8>>>, check_order: impl Fn(&[u8], &[u8]) -> Ordering,
|
||||
) -> Option<impl Iterator<Item = Vec<u8>>> {
|
||||
let first_iterator = iterators.next()?;
|
||||
let mut other_iterators = iterators.map(Iterator::peekable).collect::<Vec<_>>();
|
||||
|
||||
Some(first_iterator.filter(move |target| {
|
||||
other_iterators.iter_mut().all(|it| {
|
||||
while let Some(element) = it.peek() {
|
||||
match check_order(element, target) {
|
||||
Ordering::Greater => return false, // We went too far
|
||||
Ordering::Equal => return true, // Element is in both iters
|
||||
Ordering::Less => {
|
||||
// Keep searching
|
||||
it.next();
|
||||
},
|
||||
}
|
||||
}
|
||||
false
|
||||
})
|
||||
}))
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
pub mod algorithm;
|
||||
pub mod bytes;
|
||||
pub mod content_disposition;
|
||||
pub mod debug;
|
||||
|
@ -13,9 +14,10 @@ pub mod sys;
|
|||
mod tests;
|
||||
pub mod time;
|
||||
|
||||
use std::cmp::{self, Ordering};
|
||||
use std::cmp;
|
||||
|
||||
pub use ::ctor::{ctor, dtor};
|
||||
pub use algorithm::common_elements;
|
||||
pub use bytes::{increment, u64_from_bytes, u64_from_u8, u64_from_u8x8};
|
||||
pub use conduit_macros::implement;
|
||||
pub use debug::slice_truncated as debug_slice_truncated;
|
||||
|
@ -47,27 +49,3 @@ pub fn generate_keypair() -> Vec<u8> {
|
|||
);
|
||||
value
|
||||
}
|
||||
|
||||
#[allow(clippy::impl_trait_in_params)]
|
||||
pub fn common_elements(
|
||||
mut iterators: impl Iterator<Item = impl Iterator<Item = Vec<u8>>>, check_order: impl Fn(&[u8], &[u8]) -> Ordering,
|
||||
) -> Option<impl Iterator<Item = Vec<u8>>> {
|
||||
let first_iterator = iterators.next()?;
|
||||
let mut other_iterators = iterators.map(Iterator::peekable).collect::<Vec<_>>();
|
||||
|
||||
Some(first_iterator.filter(move |target| {
|
||||
other_iterators.iter_mut().all(|it| {
|
||||
while let Some(element) = it.peek() {
|
||||
match check_order(element, target) {
|
||||
Ordering::Greater => return false, // We went too far
|
||||
Ordering::Equal => return true, // Element is in both iters
|
||||
Ordering::Less => {
|
||||
// Keep searching
|
||||
it.next();
|
||||
},
|
||||
}
|
||||
}
|
||||
false
|
||||
})
|
||||
}))
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue