Skip to content

Commit cf75bc1

Browse files
authored
chore(core): Clean up Writable mapping (#1933)
1 parent 6c26a86 commit cf75bc1

1 file changed

Lines changed: 15 additions & 10 deletions

File tree

crates/freya-core/src/lifecycle/writable.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
//! Type-erased writable state that hides generic type parameters.
22
3-
use std::rc::Rc;
3+
use std::{
4+
cell::{
5+
Ref,
6+
RefMut,
7+
},
8+
rc::Rc,
9+
};
410

511
use crate::prelude::*;
612

@@ -139,21 +145,20 @@ impl<T: 'static> Writable<T> {
139145
///
140146
/// ```rust, ignore
141147
/// 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();
143149
///
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);
148151
/// ```
149152
pub fn map<O>(
150153
&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,
153156
) -> Writable<O> {
157+
let peek_fn = self.peek_fn.clone();
158+
let write_fn = self.write_fn.clone();
154159
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)))),
157162
subscribe_fn: self.subscribe_fn.clone(),
158163
notify_fn: self.notify_fn.clone(),
159164
}

0 commit comments

Comments
 (0)