Skip to main content

slop_commit/
message.rs

1use std::{ops::Deref, sync::Arc};
2
3use serde::{Deserialize, Serialize};
4use slop_alloc::HasBackend;
5
6/// A message sent to a prover.
7///
8/// In a commitment scheme, the prover can send messages to the verifier and later make structural
9/// claims about them. The [Message] struct is used as input to the prover when sending the actual
10/// data. The main usefulness of this struct is that it is cheap to clone if the number of different
11/// message batches sent is small.
12#[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        // All elements are assumed to have the same backend.
99        self.values.first().expect("Message is empty").backend()
100    }
101}