|
1 | 1 | //! Type-erased writable state that hides generic type parameters. |
2 | 2 |
|
3 | | -use std::rc::Rc; |
| 3 | +use std::{ |
| 4 | + cell::{ |
| 5 | + Ref, |
| 6 | + RefMut, |
| 7 | + }, |
| 8 | + rc::Rc, |
| 9 | +}; |
4 | 10 |
|
5 | 11 | use crate::prelude::*; |
6 | 12 |
|
@@ -139,21 +145,20 @@ impl<T: 'static> Writable<T> { |
139 | 145 | /// |
140 | 146 | /// ```rust, ignore |
141 | 147 | /// let user = use_state(|| (String::from("Alice"), 30)); |
142 | | - /// let writable: Writable<(String, u32)> = user.into_writable(); |
| 148 | + /// let user: Writable<(String, u32)> = user.into_writable(); |
143 | 149 | /// |
144 | | - /// let name = writable.map( |
145 | | - /// move || user.peek().map(|user| Ref::map(user, |user| &user.0)), |
146 | | - /// move || user.write_silently().map(|user| RefMut::map(user, |user| &mut user.0)), |
147 | | - /// ); |
| 150 | + /// let name = user.map(|user| &user.0, |user| &mut user.0); |
148 | 151 | /// ``` |
149 | 152 | pub fn map<O>( |
150 | 153 | &self, |
151 | | - peek_fn: impl Fn() -> ReadRef<'static, O> + 'static, |
152 | | - write_fn: impl Fn() -> WriteRef<'static, O> + 'static, |
| 154 | + get: impl Fn(&T) -> &O + 'static, |
| 155 | + get_mut: impl Fn(&mut T) -> &mut O + 'static, |
153 | 156 | ) -> Writable<O> { |
| 157 | + let peek_fn = self.peek_fn.clone(); |
| 158 | + let write_fn = self.write_fn.clone(); |
154 | 159 | Writable { |
155 | | - peek_fn: Rc::new(peek_fn), |
156 | | - write_fn: Rc::new(write_fn), |
| 160 | + peek_fn: Rc::new(move || (peek_fn)().map(|r| Ref::map(r, |v| get(v)))), |
| 161 | + write_fn: Rc::new(move || (write_fn)().map(|r| RefMut::map(r, |v| get_mut(v)))), |
157 | 162 | subscribe_fn: self.subscribe_fn.clone(), |
158 | 163 | notify_fn: self.notify_fn.clone(), |
159 | 164 | } |
|
0 commit comments