use unicode_truncate::{Alignment, UnicodeTruncateStr};
pub fn n_lines<T: AsRef<str>>(s: T) -> usize {
s.as_ref().chars().filter(|&c| c == '\n').count()
}
pub fn width<T: AsRef<str>>(s: T) -> usize {
s.as_ref()
.split('\n')
.map(|s| s.chars().count())
.max()
.unwrap_or(0)
}
pub fn line_width<T: AsRef<str>>(s: T) -> usize {
s.as_ref().chars().count()
}
pub fn lines<T: AsRef<str>>(s: T) -> Vec<String> {
s.as_ref().split('\n').map(|s| s.to_string()).collect()
}
pub fn align_left<T: AsRef<str>>(s: T, width: usize) -> String {
s.as_ref()
.split('\n')
.map(|s| align_line_left(s, width))
.collect::<Vec<_>>()
.join("\n")
}
pub fn align_right<T: AsRef<str>>(s: T, width: usize) -> String {
s.as_ref()
.split('\n')
.map(|s| align_line_right(s, width))
.collect::<Vec<_>>()
.join("\n")
}
pub fn align_line_left<T: AsRef<str>>(s: T, width: usize) -> String {
s.as_ref().unicode_pad(width, Alignment::Left, false).into()
}
pub fn align_line_right<T: AsRef<str>>(s: T, width: usize) -> String {
s.as_ref()
.unicode_pad(width, Alignment::Right, false)
.into()
}