use core::hash::Hash;
pub trait Map {
type TFrom;
type TOut<TTo>;
fn map<TTo, F: FnMut(Self::TFrom) -> TTo>(self, f: F) -> Self::TOut<TTo>;
}
impl<TFrom, const N: usize> Map for [TFrom; N] {
type TFrom = TFrom;
type TOut<TTo> = [TTo; N];
fn map<TTo, F: FnMut(TFrom) -> TTo>(self, f: F) -> Self::TOut<TTo> {
self.map(f)
}
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl<TFrom> Map for lib::vec::Vec<TFrom> {
type TFrom = TFrom;
type TOut<TTo> = lib::vec::Vec<TTo>;
fn map<TTo, F: FnMut(TFrom) -> TTo>(self, f: F) -> Self::TOut<TTo> {
self.into_iter().map(f).collect()
}
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl<TKey, TFrom> Map for lib::collections::BTreeMap<TKey, TFrom> where TKey: Ord {
type TFrom = TFrom;
type TOut<TTo> = lib::collections::BTreeMap<TKey, TTo>;
fn map<TTo, F: FnMut(TFrom) -> TTo>(self, mut f: F) -> Self::TOut<TTo> {
self.into_iter().map(|(k, v)| (k, f(v))).collect()
}
}
#[cfg(any(feature = "std"))]
impl<TKey, TFrom> Map for lib::collections::HashMap<TKey, TFrom> where TKey: Hash + Eq {
type TFrom = TFrom;
type TOut<TTo> = lib::collections::HashMap<TKey, TTo>;
fn map<TTo, F: FnMut(TFrom) -> TTo>(self, mut f: F) -> Self::TOut<TTo> {
self.into_iter().map(|(k, v)| (k, f(v))).collect()
}
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl<TFrom> Map for lib::collections::LinkedList<TFrom> {
type TFrom = TFrom;
type TOut<TTo> = lib::collections::LinkedList<TTo>;
fn map<TTo, F: FnMut(TFrom) -> TTo>(self, f: F) -> Self::TOut<TTo> {
self.into_iter().map(f).collect()
}
}
#[cfg(any(feature = "std", feature = "alloc"))]
impl<TFrom> Map for lib::collections::VecDeque<TFrom> {
type TFrom = TFrom;
type TOut<TTo> = lib::collections::VecDeque<TTo>;
fn map<TTo, F: FnMut(TFrom) -> TTo>(self, f: F) -> Self::TOut<TTo> {
self.into_iter().map(f).collect()
}
}