pub async fn yield_once() {
let mut pending = true;
futures::future::poll_fn(move |cx| {
if pending {
pending = false;
cx.waker().wake_by_ref();
core::task::Poll::Pending
} else {
core::task::Poll::Ready(())
}
})
.await
}
pub fn truncate_str_iter(
input: impl Iterator<Item = char>,
limit: usize,
) -> impl Iterator<Item = char> {
struct Iter<I>(I, usize, bool, usize);
impl<I: Iterator<Item = char>> Iterator for Iter<I> {
type Item = char;
fn next(&mut self) -> Option<Self::Item> {
if self.2 {
return None;
}
if self.1 >= self.3 {
self.2 = true;
if self.0.next().is_some() {
return Some('…');
} else {
return None;
}
}
self.1 += 1;
self.0.next()
}
fn size_hint(&self) -> (usize, Option<usize>) {
let (min, max) = self.0.size_hint();
let max = max.and_then(|m| m.checked_add(1));
(min, max)
}
}
Iter(input, 0, false, limit)
}