rename memo to selector

This commit is contained in:
Evan Almloff committed 2023-08-07 16:17:47 -07:00
1 parent 646c161c7d
commit 2c7d0700d4
3 files changed
+5 -5

No files matched your search

+45
View File
@@ -0,0 +1,45 @@
use dioxus_core::prelude::*;
use crate::{get_effect_stack, signal::SignalData, CopyValue, Effect, ReadOnlySignal, Signal};
pub fn use_selector<R: PartialEq>(
cx: &ScopeState,
f: impl FnMut() -> R + 'static,
) -> ReadOnlySignal<R> {
*cx.use_hook(|| selector(f))
}
pub fn selector<R: PartialEq>(mut f: impl FnMut() -> R + 'static) -> ReadOnlySignal<R> {
let state = Signal::<R> {
inner: CopyValue::invalid(),
};
let effect = Effect {
callback: CopyValue::invalid(),
};
{
get_effect_stack().effects.write().push(effect);
}
state.inner.value.set(SignalData {
subscribers: Default::default(),
effect_subscribers: Default::default(),
update_any: schedule_update_any().expect("in a virtual dom"),
value: f(),
});
{
get_effect_stack().effects.write().pop();
}
effect.callback.value.set(Box::new(move || {
let value = f();
let changed = {
let old = state.inner.read();
value != old.value
};
if changed {
state.set(value)
}
}));
ReadOnlySignal::new(state)
}