1use freya_core::lifecycle::writable::{
2 IntoWritable,
3 Writable,
4};
5
6use crate::{
7 hooks::RadioChannel,
8 slice::RadioSliceMut,
9};
10
11pub trait RadioWritable<T: 'static> {
12 fn from_slice<Value, Channel>(slice: RadioSliceMut<Value, T, Channel>) -> Self
13 where
14 Value: 'static,
15 Channel: RadioChannel<Value> + 'static;
16}
17
18impl<T: 'static> RadioWritable<T> for Writable<T> {
19 fn from_slice<Value, Channel>(slice: RadioSliceMut<Value, T, Channel>) -> Self
20 where
21 Value: 'static,
22 Channel: RadioChannel<Value> + 'static,
23 {
24 Self::new(
25 {
26 let slice = slice.clone();
27 move || slice.peek_unchecked()
28 },
29 {
30 let slice = slice.clone();
31 move || slice.write_silently()
32 },
33 {
34 let slice = slice.clone();
35 move || slice.subscribe_if_not()
36 },
37 move || slice.notify(),
38 )
39 }
40}
41
42impl<T: 'static, Value: 'static, Channel: RadioChannel<Value> + 'static> IntoWritable<T>
43 for RadioSliceMut<Value, T, Channel>
44{
45 fn into_writable(self) -> Writable<T> {
46 Writable::from_slice(self)
47 }
48}