cfg_if! {
if #[cfg(feature = "std")] {
use std::mem::swap;
} else {
use core::mem::swap;
}
}
use len_trait::Clear;
use base::{CanPush, Push};
use ordered::{PushBack, PushFront};
pub trait Append: Sized + Clear {
fn append(&mut self, val: &mut Self);
}
impl<T: Append> CanPush<T> for T {
type PushedOut = T;
}
impl<T: Append> Push<T> for T {
fn push(&mut self, mut val: T) -> Option<T> {
self.append(&mut val);
if val.is_empty() { None } else { Some(val) }
}
}
pub trait AppendBack: Append {
fn append_back(&mut self, val: &mut Self) {
self.append(val)
}
}
impl<T: AppendBack> PushBack<T> for T {}
pub trait AppendFront: AppendBack {
fn append_front(&mut self, val: &mut Self) {
swap(val, self);
val.append_back(self)
}
}
impl<T: AppendFront> PushFront<T> for T {
fn push_front(&mut self, mut val: T) -> Option<T> {
self.append_front(&mut val);
if val.is_empty() { None } else { Some(val) }
}
}