use std::ops::Deref;
use std::marker::PhantomData;
pub struct DerefMap<TSource, TSourceDeref, TTarget, MapFn>
where TSource: Deref<Target=TSourceDeref>, MapFn: Fn(&TSourceDeref) -> &TTarget {
source: TSource,
map: MapFn,
phantom: PhantomData<TTarget>,
}
impl<TSource, TSourceDeref, TTarget, MapFn> DerefMap<TSource, TSourceDeref, TTarget, MapFn>
where TSource: Deref<Target=TSourceDeref>, MapFn: Fn(&TSourceDeref) -> &TTarget {
pub fn map(source: TSource, map: MapFn) -> DerefMap<TSource, TSourceDeref, TTarget, MapFn> {
DerefMap {
source: source,
map: map,
phantom: PhantomData
}
}
}
impl<TSource, TSourceDeref, TTarget, MapFn> Deref for DerefMap<TSource, TSourceDeref, TTarget, MapFn>
where TSource: Deref<Target=TSourceDeref>, MapFn: Fn(&TSourceDeref) -> &TTarget {
type Target = TTarget;
fn deref(&self) -> &TTarget {
(self.map)(self.source.deref())
}
}