#[cfg(feature = "smallvec")]
use smallvec::SmallVec;
use crate::MergableSpan;
pub trait AppendRle<T: MergableSpan> {
fn push_rle(&mut self, item: T) -> bool;
fn push_reversed_rle(&mut self, item: T) -> bool;
}
impl<T: MergableSpan> AppendRle<T> for Vec<T> {
fn push_rle(&mut self, item: T) -> bool {
if let Some(v) = self.last_mut() {
if v.can_append(&item) {
v.append(item);
return true;
}
}
self.push(item);
false
}
fn push_reversed_rle(&mut self, item: T) -> bool {
if let Some(v) = self.last_mut() {
if item.can_append(v) {
v.prepend(item);
return true;
}
}
self.push(item);
false
}
}
#[cfg(feature = "smallvec")]
impl<A: smallvec::Array> AppendRle<A::Item> for SmallVec<A> where A::Item: MergableSpan {
fn push_rle(&mut self, item: A::Item) -> bool {
if let Some(v) = self.last_mut() {
if v.can_append(&item) {
v.append(item);
return true;
}
}
self.push(item);
false
}
fn push_reversed_rle(&mut self, item: A::Item) -> bool {
if let Some(v) = self.last_mut() {
if item.can_append(v) {
v.prepend(item);
return true;
}
}
self.push(item);
false
}
}