1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use dominator::{clone, DomBuilder};
use futures_signals::signal::{Mutable, Signal, SignalExt};
use web_sys::Element;

pub fn store_signal_value_mixin<A, TValue, TSignal>(
    source_signal: TSignal,
    target_mutable: &Mutable<TValue>,
) -> impl FnOnce(DomBuilder<A>) -> DomBuilder<A>
where
    A: AsRef<Element>,
    TValue: 'static,
    TSignal: Signal<Item = TValue> + 'static,
{
    clone!(target_mutable => move |d| {
        d.future(source_signal.for_each(clone!(target_mutable => move |v| {
            target_mutable.set(v);
            async {}
        })))
    })
}

pub fn store_signal_value_opt_mixin<A, TValue, TSignal>(
    source_signal: TSignal,
    target_mutable: &Mutable<TValue>,
) -> impl FnOnce(DomBuilder<A>) -> DomBuilder<A>
where
    A: AsRef<Element>,
    TValue: 'static,
    TSignal: Signal<Item = Option<TValue>> + 'static,
{
    clone!(target_mutable =>move |d| {
        d.future(
            source_signal
                .for_each(clone!(target_mutable => move |v| {
                    if let Some(value) = v {
                        target_mutable.set(value);
                    }
                    async {}
            })),
        )
    })
}