use super::*;
pub trait Sequence {}
impl<T> Sequence for Vec<T> {}
impl<T> Sequence for [T] {}
impl<T> Sequence for VecDeque<T> {}
impl<T> Sequence for LinkedList<T> {}
impl Sequence for String {}
impl Sequence for str {}
impl Sequence for OsString {}
impl Sequence for OsStr {}
pub trait TryPush<T> : Push<T>
{
type Error;
fn try_push(&mut self, value : T) -> Result<Self::Output, Self::Error>;
}
pub trait Push<T>
{
type Output;
fn push(&mut self, value : T) -> Self::Output;
}
pub trait TryPop<T> : Pop<T>
{
type Error;
fn try_pop(&mut self) -> Result<T, Self::Error>;
}
pub trait Pop<T>
{
fn pop(&mut self) -> Option<T>;
}
impl<T> Push<T> for Vec<T>
{
type Output = usize;
fn push(&mut self, value : T) -> Self::Output
{
let l = self.len();
self.push(value);
l
}
}
impl<T> TryPush<T> for Vec<T>
{
type Error = (); fn try_push(&mut self, value : T) -> Result<Self::Output, Self::Error> { Ok(Push::push(self, value)) }
}
impl<T> Push<T> for VecDeque<T>
{
type Output = usize;
fn push(&mut self, value : T) -> Self::Output
{
let l = self.len();
self.push_back(value);
l
}
}
impl<T> TryPush<T> for VecDeque<T>
{
type Error = (); fn try_push(&mut self, value : T) -> Result<Self::Output, Self::Error> { Ok(Push::push(self, value)) }
}
impl<T> Push<T> for LinkedList<T>
{
type Output = ();
fn push(&mut self, value : T) -> Self::Output {
self.push_back(value);
}
}
impl<T> TryPush<T> for LinkedList<T>
{
type Error = (); fn try_push(&mut self, value : T) -> Result<Self::Output, Self::Error> {
self.push(value);
Ok(())
}
}
impl Push<char> for String
{
type Output = ();
fn push(&mut self, value : char) -> Self::Output {
self.push(value);
}
}
impl TryPush<char> for String
{
type Error = (); fn try_push(&mut self, value : char) -> Result<Self::Output, Self::Error> {
self.push(value);
Ok(())
}
}
impl<'b> Push<&'b OsStr> for OsString
{
type Output = ();
fn push(&mut self, value : &'b OsStr) -> Self::Output {
self.push(value);
}
}
impl<'b> TryPush<&'b OsStr> for OsString
{
type Error = (); fn try_push(&mut self, value : &'b OsStr) -> Result<Self::Output, Self::Error> {
self.push(value);
Ok(())
}
}
impl<T> TryPop<T> for Vec<T>
{
type Error=(); fn try_pop(&mut self) -> Result<T, Self::Error> { self.pop().ok_or(()) }
}
impl<T> Pop<T> for Vec<T>
{
fn pop(&mut self) -> Option<T> { self.pop() }
}
impl<T> TryPop<T> for VecDeque<T>
{
type Error=(); fn try_pop(&mut self) -> Result<T, Self::Error> { self.pop_back().ok_or(()) }
}
impl<T> Pop<T> for VecDeque<T>
{
fn pop(&mut self) -> Option<T> { self.pop_back() }
}
impl<T> TryPop<T> for LinkedList<T>
{
type Error=(); fn try_pop(&mut self) -> Result<T, Self::Error> { self.pop_back().ok_or(()) }
}
impl<T> Pop<T> for LinkedList<T>
{
fn pop(&mut self) -> Option<T> { self.pop_back() }
}