maycoon_core/signal/
fixed.rs

1use crate::signal::{Ref, Signal};
2use std::rc::Rc;
3
4/// A signal with a fixed value. Based on [Rc].
5///
6/// The inner value cannot be mutated and listeners do not exist.
7///
8/// Useful for testing purposes, but also used in `MaybeSignal::into_signal` to convert a fixed value into a signal.
9pub struct FixedSignal<T: 'static> {
10    value: Rc<T>,
11}
12
13impl<T: 'static> FixedSignal<T> {
14    /// Creates a new fixed signal.
15    #[inline(always)]
16    pub fn new(value: T) -> Self {
17        Self {
18            value: Rc::new(value),
19        }
20    }
21}
22
23impl<T: 'static> Signal<T> for FixedSignal<T> {
24    #[inline(always)]
25    fn get(&self) -> Ref<'_, T> {
26        Ref::Borrow(self.value.as_ref())
27    }
28
29    #[inline(always)]
30    fn set_value(&self, _: T) {}
31
32    #[inline(always)]
33    fn listen(self, _: Box<dyn Fn(Ref<'_, T>)>) -> Self
34    where
35        Self: Sized,
36    {
37        self
38    }
39
40    #[inline(always)]
41    fn notify(&self) {}
42
43    #[inline(always)]
44    fn dyn_clone(&self) -> Box<dyn Signal<T>> {
45        Box::new(self.clone())
46    }
47}
48
49impl<T: 'static> From<Rc<T>> for FixedSignal<T> {
50    #[inline(always)]
51    fn from(value: Rc<T>) -> Self {
52        Self { value }
53    }
54}
55
56impl<T: 'static> Clone for FixedSignal<T> {
57    #[inline(always)]
58    fn clone(&self) -> Self {
59        Self {
60            value: self.value.clone(),
61        }
62    }
63}