mod fallible_iterator;
pub(crate) mod human_readable;
pub(crate) mod logging;
pub(crate) mod multi_index_map;
pub mod normalize_schema;
pub(crate) mod serde_bridge;
use std::cell::OnceCell;
pub(crate) use fallible_iterator::*;
pub(crate) use multi_index_map::MultiIndexMap;
pub(crate) fn iter_into_single_item<T>(mut iter: impl Iterator<Item = T>) -> Option<T> {
let item = iter.next()?;
if iter.next().is_none() {
Some(item)
} else {
None
}
}
pub(crate) fn first_max_by_key<T, O: Ord>(
iter: impl Iterator<Item = T>,
f: impl Fn(&T) -> O,
) -> Option<T> {
let mut iter = iter.peekable();
let first = iter.next()?;
let mut max_item = first;
let mut max_key = f(&max_item);
for item in iter {
let key = f(&item);
if key > max_key {
max_key = key;
max_item = item;
}
}
Some(max_item)
}
pub(crate) struct FallibleOnceCell<T>(OnceCell<T>);
impl<T: std::fmt::Debug> FallibleOnceCell<T> {
pub(crate) fn new() -> Self {
Self(OnceCell::new())
}
pub(crate) fn get_or_try_init<F, E>(&self, f: F) -> Result<&T, E>
where
F: FnOnce() -> Result<T, E>,
{
let value = match self.0.get() {
Some(value) => value,
None => {
let value = f()?;
self.0.set(value).unwrap();
self.0.get().unwrap()
}
};
Ok(value)
}
}