access/
map.rs

1use crate::{Access, AccessMut};
2
3pub struct MapAccess<A, F> {
4    access: A,
5    from: F,
6}
7
8impl<'a, A, F> MapAccess<A, F> {
9    pub(crate) fn new(access: A, from: F) -> Self {
10        Self { access, from }
11    }
12}
13
14impl<T, B, A, F> Access for MapAccess<A, F>
15where
16    A: Access<Target = T>,
17    F: Fn(T) -> B,
18{
19    type Target = B;
20
21    fn get(&self) -> B {
22        (self.from)(self.access.get())
23    }
24}
25
26pub struct MapAccessMut<A, F, I> {
27    access: A,
28    from: F,
29    into: I,
30}
31
32impl<'a, A, F, I> MapAccessMut<A, F, I> {
33    pub(crate) fn new(access: A, from: F, into: I) -> Self {
34        Self { access, from, into }
35    }
36}
37
38impl<T, B, A, F, I> Access for MapAccessMut<A, F, I>
39where
40    A: Access<Target = T>,
41    F: Fn(T) -> B,
42{
43    type Target = B;
44
45    fn get(&self) -> B {
46        (self.from)(self.access.get())
47    }
48}
49
50impl<T, B, A, F, I> AccessMut for MapAccessMut<A, F, I>
51where
52    A: AccessMut<Target = T>,
53    F: Fn(T) -> B,
54    I: Fn(B) -> T,
55{
56    fn set(&mut self, value: B) {
57        self.access.set((self.into)(value));
58    }
59}