use crate::Bytes;
use crate::RrError;
pub trait Stack {
fn index<K: Bytes>(&self, key: &K, index: i64) -> Result<Vec<u8>, RrError>;
fn len<K: Bytes>(&self, key: &K) -> Result<i64, RrError>;
fn push<K: Bytes, V: Bytes>(&mut self, key: &K, value: &V) -> Result<i64, RrError>;
fn pushs<K: Bytes, V: Bytes>(&mut self, key: &K, values: &[&V]) -> Result<i64, RrError>;
fn push_exists<K: Bytes, V: Bytes>(&mut self, key: &K, value: &V) -> Result<i64, RrError>;
fn range<K: Bytes>(&self, key: &K, start: i64, stop: i64) -> Result<Vec<Vec<u8>>, RrError>;
fn set<K: Bytes, V: Bytes>(&mut self, key: &K, index: i64, value: &V) -> Result<Vec<u8>, RrError>;
fn pop<K: Bytes>(&self, key: &K) -> Result<Vec<u8>, RrError>;
fn pops<K: Bytes>(&self, key: &K, amount: u64) -> Result<Vec<Vec<u8>>, RrError>;
fn poplpush<K: Bytes, V: Bytes>(&mut self, key: &K, dstkey: &K) -> Result<V, RrError>;
fn clear<K: Bytes>(&mut self, key: &K) -> Result<i64, RrError>;
}