wasmrs_rx/flux/
observer.rs

1use wasmrs_runtime::ConditionallySendSync;
2
3use super::Signal;
4use crate::Error;
5
6/// The wasmrs-rx implementation of an Rx Observer trait
7pub trait Observer<Item, Err>
8where
9  Item: ConditionallySendSync,
10  Err: ConditionallySendSync,
11{
12  /// Send a complete [Signal]
13  fn send_signal(&self, signal: Signal<Item, Err>) -> Result<(), Error>;
14
15  /// Send a [Result] and have it map to an appropriate [Signal] variant.
16  fn send_result(&self, result: Result<Item, Err>) -> Result<(), Error> {
17    self.send_signal(match result {
18      Ok(ok) => Signal::Ok(ok),
19      Err(err) => Signal::Err(err),
20    })
21  }
22
23  /// Send a successful value.
24  fn send(&self, item: Item) -> Result<(), Error> {
25    self.send_signal(Signal::Ok(item))
26  }
27
28  /// Send an error value.
29  fn error(&self, err: Err) -> Result<(), Error> {
30    self.send_signal(Signal::Err(err))
31  }
32
33  /// Mark the [Observer] as complete.
34  fn complete(&self) {
35    let _ = self.send_signal(Signal::Complete);
36  }
37
38  /// Returns true if the observer has been closed.
39  fn is_complete(&self) -> bool;
40}
41
42impl<Item, Err, F> Observer<Item, Err> for F
43where
44  Item: ConditionallySendSync,
45  Err: ConditionallySendSync,
46  F: Fn(Signal<Item, Err>) -> Result<(), Error>,
47{
48  fn send_signal(&self, signal: Signal<Item, Err>) -> Result<(), Error> {
49    self(signal)
50  }
51
52  fn is_complete(&self) -> bool {
53    false
54  }
55}