sfcpl 0.1.1

private library for atcoder
Documentation
use itertools::*;

pub trait Visualize {
    fn visualize(&self) -> String;
}

macro_rules! impl_vis_sized {
    ($t:ty) => {
        impl Visualize for $t {
            fn visualize(&self) -> String {
                self.to_string()
            }
        }
    };
}

impl_vis_sized!(usize);
impl_vis_sized!(u8);
impl_vis_sized!(u16);
impl_vis_sized!(u32);
impl_vis_sized!(u64);
impl_vis_sized!(u128);
impl_vis_sized!(isize);
impl_vis_sized!(i8);
impl_vis_sized!(i16);
impl_vis_sized!(i32);
impl_vis_sized!(i64);
impl_vis_sized!(i128);
impl_vis_sized!(char);
impl_vis_sized!(bool);
impl_vis_sized!(&str);

impl<T: Visualize> Visualize for [T] {
    fn visualize(&self) -> String {
        self.iter().map(|x| x.visualize()).join(" ")
    }
}

impl Visualize for Vec<char> {
    fn visualize(&self) -> String {
        self.iter().join("")
    }
}

impl Visualize for Vec<bool> {
    fn visualize(&self) -> String {
        self.iter().map(|x| if *x { "1" } else { "0" }).join("")
    }
}

impl Visualize for String {
    fn visualize(&self) -> String {
        self.clone()
    }
}

impl Visualize for Vec<Vec<char>> {
    fn visualize(&self) -> String {
        self.iter().map(|x| x.visualize()).join("\n")
    }
}

#[macro_export]
macro_rules! vis {
    ($e:expr) => {
        let mut res = format!("[{}:{}] {} =\n{}", file!(), line!(), stringify!($e), $e.visualize());
        eprintln!("{}", res);
    };
}