1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use futures_signals::signal::{channel, Signal, SignalExt};

/// All credit to Pauan https://github.com/Pauan for this function.
pub fn split_signal<S, A, F>(
    signal: S,
    initial_value: A,
    mut map: F,
) -> (impl Signal<Item = S::Item>, impl Signal<Item = A>)
where
    S: Signal,
    F: FnMut(&S::Item) -> A,
{
    let (sender, receiver) = channel(initial_value);

    let signal = signal.map(move |value| {
        let _ = sender.send(map(&value));
        value
    });

    (signal, receiver)
}