use super::convert::AsInner;
use regex::Regex;
use std::any::type_name;
use std::fmt::Debug;
use std::sync::LazyLock;
static TYPENAME_REGEX: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"\w+::").unwrap());
pub trait DisplayExt {
fn display_top(&self, n: usize) -> String;
}
impl<T> DisplayExt for T
where
T: AsInner,
<T as AsInner>::Type: IntoIterator + Clone,
<<T as AsInner>::Type as IntoIterator>::Item: Debug,
{
fn display_top(&self, n: usize) -> String {
let name = TYPENAME_REGEX.replace_all(type_name::<T>(), "");
let inner = self.inner().to_owned();
let mut length = 0;
let mut peek = Vec::with_capacity(n);
for (i, item) in inner.into_iter().enumerate() {
if i < n {
peek.push(item);
}
length += 1;
}
format!(
"{}::{{len={}, top-{}={:x?}}}",
name,
length,
peek.len(),
peek
)
}
}