1use std::{ops::Deref, sync::Arc};
2
3use serde::{Deserialize, Serialize};
4use slop_alloc::HasBackend;
5
6#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
13pub struct Message<T> {
14 values: Vec<Arc<T>>,
15}
16
17impl<T> Default for Message<T> {
18 fn default() -> Self {
19 Self { values: vec![] }
20 }
21}
22
23impl<T> From<Vec<T>> for Message<T> {
24 fn from(value: Vec<T>) -> Self {
25 let values = value.into_iter().map(|t| Arc::new(t)).collect();
26 Self { values }
27 }
28}
29
30impl<T> From<Vec<Arc<T>>> for Message<T> {
31 fn from(value: Vec<Arc<T>>) -> Self {
32 Self { values: value }
33 }
34}
35
36impl<T> FromIterator<T> for Message<T> {
37 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
38 let values = iter.into_iter().map(|t| Arc::new(t)).collect::<Vec<_>>();
39 Self { values }
40 }
41}
42
43impl<T> FromIterator<Arc<T>> for Message<T> {
44 fn from_iter<I: IntoIterator<Item = Arc<T>>>(iter: I) -> Self {
45 let values = iter.into_iter().collect::<Vec<_>>();
46 Self { values }
47 }
48}
49
50impl<T> IntoIterator for Message<T> {
51 type Item = Arc<T>;
52 type IntoIter = <Vec<Arc<T>> as IntoIterator>::IntoIter;
53 fn into_iter(self) -> Self::IntoIter {
54 self.values.into_iter()
55 }
56}
57
58impl<T> Deref for Message<T> {
59 type Target = Vec<Arc<T>>;
60 fn deref(&self) -> &Self::Target {
61 &self.values
62 }
63}
64
65impl<T> From<Arc<T>> for Message<T> {
66 #[inline]
67 fn from(value: Arc<T>) -> Self {
68 Self { values: vec![value] }
69 }
70}
71
72impl<T> From<T> for Message<T> {
73 #[inline]
74 fn from(value: T) -> Self {
75 Self::from(Arc::new(value))
76 }
77}
78
79impl<T> Extend<T> for Message<T> {
80 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
81 self.values.extend(iter.into_iter().map(|t| Arc::new(t)));
82 }
83}
84
85impl<T> Extend<Arc<T>> for Message<T> {
86 fn extend<I: IntoIterator<Item = Arc<T>>>(&mut self, iter: I) {
87 self.values.extend(iter);
88 }
89}
90
91impl<T> HasBackend for Message<T>
92where
93 T: HasBackend,
94{
95 type Backend = T::Backend;
96
97 fn backend(&self) -> &Self::Backend {
98 self.values.first().expect("Message is empty").backend()
100 }
101}