diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
| commit | 8cdfa445d6629ffef4cb84967ff7017654045bc2 (patch) | |
| tree | 22f0b0907c024c78d26a731e2e1f5219407d8102 /vendor/petgraph/src/iter_format.rs | |
| parent | 4351c74c7c5f97156bc94d3a8549b9940ac80e3f (diff) | |
chore: add vendor directory
Diffstat (limited to 'vendor/petgraph/src/iter_format.rs')
| -rw-r--r-- | vendor/petgraph/src/iter_format.rs | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/vendor/petgraph/src/iter_format.rs b/vendor/petgraph/src/iter_format.rs new file mode 100644 index 00000000..c882b1e7 --- /dev/null +++ b/vendor/petgraph/src/iter_format.rs @@ -0,0 +1,102 @@ +//! Formatting utils + +use std::cell::RefCell; +use std::fmt; + +/// Format the iterator like a map +pub struct DebugMap<F>(pub F); + +impl<F, I, K, V> fmt::Debug for DebugMap<F> +where + F: Fn() -> I, + I: IntoIterator<Item = (K, V)>, + K: fmt::Debug, + V: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_map().entries((self.0)()).finish() + } +} + +/// Avoid "pretty" debug +pub struct NoPretty<T>(pub T); + +impl<T> fmt::Debug for NoPretty<T> +where + T: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:?}", self.0) + } +} + +/// Format all iterator elements lazily, separated by `sep`. +/// +/// The format value can only be formatted once, after that the iterator is +/// exhausted. +/// +/// See [`.format()`](../trait.Itertools.html#method.format) +/// for more information. +#[derive(Clone)] +pub struct Format<'a, I> { + sep: &'a str, + /// Format uses interior mutability because Display::fmt takes &self. + inner: RefCell<Option<I>>, +} + +pub trait IterFormatExt: Iterator { + fn format(self, separator: &str) -> Format<Self> + where + Self: Sized, + { + Format { + sep: separator, + inner: RefCell::new(Some(self)), + } + } +} + +impl<I> IterFormatExt for I where I: Iterator {} + +impl<I> Format<'_, I> +where + I: Iterator, +{ + fn format<F>(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result + where + F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result, + { + let mut iter = match self.inner.borrow_mut().take() { + Some(t) => t, + None => panic!("Format: was already formatted once"), + }; + + if let Some(fst) = iter.next() { + cb(&fst, f)?; + for elt in iter { + if !self.sep.is_empty() { + f.write_str(self.sep)?; + } + cb(&elt, f)?; + } + } + Ok(()) + } +} + +macro_rules! impl_format { + ($($fmt_trait:ident)*) => { + $( + impl<'a, I> fmt::$fmt_trait for Format<'a, I> + where I: Iterator, + I::Item: fmt::$fmt_trait, + { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.format(f, fmt::$fmt_trait::fmt) + } + } + )* + } +} + +impl_format!(Debug); |
