diff --git a/packages/signals/examples/iterator.rs b/packages/signals/examples/iterator.rs new file mode 100644 index 000000000..75875cde2 --- /dev/null +++ b/packages/signals/examples/iterator.rs @@ -0,0 +1,28 @@ +use dioxus::prelude::*; +use dioxus_signals::*; + +fn main() { + dioxus_desktop::launch(App); +} + +#[component] +fn App(cx: Scope) -> Element { + let signal = use_signal(cx, || vec![String::from("Hello"), String::from("World")]); + + render! { + button { + onclick: move |_| { + signal.write().push(String::from("Hello")); + }, + "Add one" + } + for i in 0..signal().len() { + Child { signal: signal.map(move |v| v.get(i).unwrap()) } + } + } +} + +#[component] +fn Child(cx: Scope, signal: SignalMap) -> Element { + render! {"{signal:?}"} +} diff --git a/packages/signals/src/map.rs b/packages/signals/src/map.rs index 1442309e1..2673fabad 100644 --- a/packages/signals/src/map.rs +++ b/packages/signals/src/map.rs @@ -13,7 +13,7 @@ pub struct SignalMap { impl SignalMap { /// Create a new mapped signal. - pub fn new(signal: Signal, mapping: fn(&T) -> &U) -> Self { + pub fn new(signal: Signal, mapping: impl Fn(&T) -> &U + 'static) -> Self { Self { origin_scope: signal.origin_scope(), mapping: CopyValue::new(Box::new(move || Ref::map(signal.read(), |v| (mapping)(v)))), diff --git a/packages/signals/src/signal.rs b/packages/signals/src/signal.rs index ad025c839..564a644e7 100644 --- a/packages/signals/src/signal.rs +++ b/packages/signals/src/signal.rs @@ -257,7 +257,7 @@ impl Signal { } /// Map the signal to a new type. - pub fn map(self, f: fn(&T) -> &O) -> SignalMap { + pub fn map(self, f: impl Fn(&T) -> &O + 'static) -> SignalMap { SignalMap::new(self, f) } }