1use std::ops;
2
3pub trait DerefExt: ops::Deref {
5 fn deref_map<F, R>(self, f: F) -> MapDeref<Self, F>
6 where
7 Self: Sized,
8 F: Fn(&Self::Target) -> &R,
9 {
10 MapDeref { deref: self, f }
11 }
12}
13
14pub struct MapDeref<T, F> {
16 deref: T,
17 f: F,
18}
19
20impl<T, F, R> ops::Deref for MapDeref<T, F>
21where
22 F: Fn(&T::Target) -> &R,
23 T: ops::Deref,
24{
25 type Target = R;
26
27 fn deref(&self) -> &Self::Target {
28 (self.f)(self.deref.deref())
29 }
30}
31
32impl<T> DerefExt for T where T: ops::Deref {}