use super::TransposeCallback;
use core::marker::PhantomData;
pub trait IterableByKeyMap<Item> {
type Key;
type DrainIter: Iterator<Item = Item>;
type Iter: Iterator<Item = Item>;
fn drain_key(key: Self::Key) -> Self::DrainIter;
fn iter_key(key: Self::Key) -> Self::Iter;
}
pub trait IterableMap<Item> {
type DrainIter: Iterator<Item = Item>;
type Iter: Iterator<Item = Item>;
fn drain() -> Self::DrainIter;
fn iter() -> Self::Iter;
}
pub trait KeyIterableByKeyMap {
type Key1;
type Key2;
type DrainIter: Iterator<Item = Self::Key2>;
type Iter: Iterator<Item = Self::Key2>;
fn drain_prefix_keys(key: Self::Key1) -> Self::DrainIter;
fn iter_prefix_keys(key: Self::Key1) -> Self::Iter;
}
pub struct GetFirstPos;
impl<K, V> TransposeCallback<(K, V), K> for GetFirstPos {
fn call(arg: (K, V)) -> K {
arg.0
}
}
impl<K1, K2, V> TransposeCallback<(K1, K2, V), K1> for GetFirstPos {
fn call(arg: (K1, K2, V)) -> K1 {
arg.0
}
}
pub struct GetSecondPos;
impl<K, V> TransposeCallback<(K, V), V> for GetSecondPos {
fn call(arg: (K, V)) -> V {
arg.1
}
}
impl<K1, K2, V> TransposeCallback<(K1, K2, V), K2> for GetSecondPos {
fn call(arg: (K1, K2, V)) -> K2 {
arg.1
}
}
pub struct GetThirdPos;
impl<K1, K2, V> TransposeCallback<(K1, K2, V), V> for GetThirdPos {
fn call(arg: (K1, K2, V)) -> V {
arg.2
}
}
pub struct IteratorWrap<I, Item = <I as Iterator>::Item, TC = ()>(I, PhantomData<(Item, TC)>)
where
I: Iterator,
TC: TransposeCallback<I::Item, Item>;
impl<I, Item, TC> From<I> for IteratorWrap<I, Item, TC>
where
I: Iterator,
TC: TransposeCallback<I::Item, Item>,
{
fn from(iterator: I) -> Self {
Self(iterator, PhantomData)
}
}
impl<I, Item, TC> Iterator for IteratorWrap<I, Item, TC>
where
I: Iterator,
TC: TransposeCallback<I::Item, Item>,
{
type Item = Item;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(TC::call)
}
}