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}