use core::fmt::{Debug, Display, Formatter, Result, Write};
pub fn from_fn<F>(f: F) -> FromFn<F> {
FromFn(f)
}
pub struct FromFn<F>(F);
impl<F> Display for FromFn<F>
where
F: Fn(&mut Formatter) -> Result,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
(self.0)(f)
}
}
impl<F> Debug for FromFn<F>
where
F: Fn(&mut Formatter) -> Result,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
(self.0)(f)
}
}
pub fn repeat<T>(item: T, n: usize) -> Repeat<T> {
Repeat { item, n }
}
#[derive(Clone, Copy)]
pub struct Repeat<T> {
pub item: T,
pub n: usize,
}
impl<T: Display> Display for Repeat<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
for _ in 0..self.n {
self.item.fmt(f)?;
}
Ok(())
}
}
pub struct FormatWith<T, F> {
pub item: T,
pub with: F,
}
impl<T, F> Display for FormatWith<T, F>
where
F: Fn(&T, &mut Formatter) -> Result,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
(self.with)(&self.item, f)
}
}
impl<T, F> Debug for FormatWith<T, F>
where
F: Fn(&T, &mut Formatter) -> Result,
{
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
(self.with)(&self.item, f)
}
}
pub struct Uppercase<T>(pub T);
pub struct Lowercase<T>(pub T);
pub struct Capitalize<T>(pub T);
impl<T: Display> Display for Uppercase<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
struct UppercaseWriter<'a, 'b>(&'a mut Formatter<'b>);
impl<'a, 'b> Write for UppercaseWriter<'a, 'b> {
fn write_str(&mut self, s: &str) -> Result {
for ch in s.chars() {
write!(self.0, "{}", ch.to_uppercase())?;
}
Ok(())
}
#[inline]
fn write_char(&mut self, c: char) -> Result {
write!(self.0, "{}", c.to_uppercase())
}
}
write!(&mut UppercaseWriter(f), "{}", self.0)
}
}
impl<T: Display> Display for Lowercase<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
struct LowercaseWriter<'a, 'b>(&'a mut Formatter<'b>);
impl<'a, 'b> Write for LowercaseWriter<'a, 'b> {
fn write_str(&mut self, s: &str) -> Result {
for ch in s.chars() {
write!(self.0, "{}", ch.to_lowercase())?;
}
Ok(())
}
#[inline]
fn write_char(&mut self, c: char) -> Result {
write!(self.0, "{}", c.to_lowercase())
}
}
write!(&mut LowercaseWriter(f), "{}", self.0)
}
}
impl<T: Display> Display for Capitalize<T> {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
struct CapitalizeWriter<'a, 'b>(&'a mut Formatter<'b>, bool);
impl<'a, 'b> Write for CapitalizeWriter<'a, 'b> {
fn write_str(&mut self, s: &str) -> Result {
if !self.1 {
let mut chars = s.chars();
if let Some(first) = chars.next() {
self.1 = true;
write!(self.0, "{}", first.to_uppercase())?;
self.0.write_str(chars.as_str())
} else {
Ok(())
}
} else {
self.0.write_str(s)
}
}
#[inline]
fn write_char(&mut self, c: char) -> Result {
if !self.1 {
self.1 = true;
write!(self.0, "{}", c.to_uppercase())
} else {
write!(self.0, "{c}")
}
}
}
write!(&mut CapitalizeWriter(f, false), "{}", self.0)
}
}
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Empty;
impl Display for Empty {
#[inline(always)]
fn fmt(&self, _: &mut Formatter<'_>) -> Result {
Ok(())
}
}