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 bytes;
|
||||||
pub mod content_disposition;
|
pub mod content_disposition;
|
||||||
pub mod debug;
|
pub mod debug;
|
||||||
|
@ -13,9 +14,10 @@ pub mod sys;
|
||||||
mod tests;
|
mod tests;
|
||||||
pub mod time;
|
pub mod time;
|
||||||
|
|
||||||
use std::cmp::{self, Ordering};
|
use std::cmp;
|
||||||
|
|
||||||
pub use ::ctor::{ctor, dtor};
|
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 bytes::{increment, u64_from_bytes, u64_from_u8, u64_from_u8x8};
|
||||||
pub use conduit_macros::implement;
|
pub use conduit_macros::implement;
|
||||||
pub use debug::slice_truncated as debug_slice_truncated;
|
pub use debug::slice_truncated as debug_slice_truncated;
|
||||||
|
@ -47,27 +49,3 @@ pub fn generate_keypair() -> Vec<u8> {
|
||||||
);
|
);
|
||||||
value
|
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