use core::{
fmt::{self, Write as _},
hash::{BuildHasher, Hasher},
marker,
};
pub fn truncated_str<'a>(
input: impl Iterator<Item = char> + Clone + 'a,
limit: usize,
) -> impl fmt::Display + 'a {
struct Iter<I>(I, usize);
impl<I: Iterator<Item = char> + Clone> fmt::Display for Iter<I> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut counter = 0;
for c in self.0.clone() {
f.write_char(c)?;
counter += 1;
if counter >= self.1 {
f.write_char('…')?;
break;
}
}
Ok(())
}
}
Iter(input, limit)
}
pub struct BuildHasherDefault<H>(marker::PhantomData<fn() -> H>);
impl<H> BuildHasherDefault<H> {
pub const fn new() -> Self {
BuildHasherDefault(marker::PhantomData)
}
}
impl<H> fmt::Debug for BuildHasherDefault<H> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("BuildHasherDefault").finish()
}
}
impl<H: Default + Hasher> BuildHasher for BuildHasherDefault<H> {
type Hasher = H;
fn build_hasher(&self) -> H {
H::default()
}
}
impl<H> Clone for BuildHasherDefault<H> {
fn clone(&self) -> BuildHasherDefault<H> {
BuildHasherDefault(marker::PhantomData)
}
}
impl<H> Default for BuildHasherDefault<H> {
fn default() -> BuildHasherDefault<H> {
BuildHasherDefault(marker::PhantomData)
}
}
impl<H> PartialEq for BuildHasherDefault<H> {
fn eq(&self, _other: &BuildHasherDefault<H>) -> bool {
true
}
}
impl<H> Eq for BuildHasherDefault<H> {}