pub trait Buffer {
fn empty() -> &'static Self
where
Self: 'static;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn split_at(&self, n: usize) -> (&Self, &Self);
fn drop_prefix(&self, n: usize) -> &Self {
self.split_at(n).1
}
fn prefix_up_to(&self, n: usize) -> &Self;
}
impl Buffer for str {
fn empty() -> &'static Self
where
Self: 'static,
{
""
}
fn len(&self) -> usize {
self.len()
}
fn split_at(&self, n: usize) -> (&Self, &Self) {
str::split_at(self, n)
}
fn prefix_up_to(&self, n: usize) -> &Self {
let n = std::cmp::min(n, self.len());
let (prefix, _) = self.split_at(std::cmp::min(self.len(), n));
prefix
}
}
impl<T> Buffer for [T] {
fn empty() -> &'static Self
where
Self: 'static,
{
&[]
}
fn len(&self) -> usize {
<[T]>::len(self)
}
fn split_at(&self, n: usize) -> (&Self, &Self) {
<[T]>::split_at(self, n)
}
fn prefix_up_to(&self, n: usize) -> &Self {
let n = std::cmp::min(n, self.len());
&self[..n]
}
}