rasi_ext/utils/
deref.rs

1use std::ops;
2
3/// This trait extend [`Deref`](ops::Deref) to add function `deref_map`
4pub 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
14/// The type map [`Deref`](ops::Deref) target to another type.
15pub 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
32/// Implement [`DerefExt`] for all type that implement trait [`Deref`](ops::Deref)
33impl<T> DerefExt for T where T: ops::Deref {}