alloy_primitives/
sealed.rs1use crate::B256;
2use derive_more::{AsRef, Deref};
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, AsRef, Deref)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10#[cfg_attr(feature = "arbitrary", derive(proptest_derive::Arbitrary))]
11pub struct Sealed<T> {
12 #[as_ref]
14 #[deref]
15 #[cfg_attr(feature = "serde", serde(flatten))]
16 inner: T,
17 #[cfg_attr(feature = "serde", serde(rename = "hash"))]
18 seal: B256,
20}
21
22impl<T> Sealed<T> {
23 pub fn new(inner: T) -> Self
25 where
26 T: Sealable,
27 {
28 let seal = inner.hash_slow();
29 Self { inner, seal }
30 }
31
32 pub fn new_ref(inner: &T) -> Sealed<&T>
34 where
35 T: Sealable,
36 {
37 let seal = inner.hash_slow();
38 Sealed { inner, seal }
39 }
40
41 pub fn new_with<F>(inner: T, f: F) -> Self
43 where
44 T: Sized,
45 F: FnOnce(&T) -> B256,
46 {
47 let seal = f(&inner);
48 Self::new_unchecked(inner, seal)
49 }
50
51 pub fn new_ref_with<F>(inner: &T, f: F) -> Sealed<&T>
53 where
54 T: Sized,
55 F: FnOnce(&T) -> B256,
56 {
57 let seal = f(inner);
58 Sealed::new_unchecked(inner, seal)
59 }
60
61 pub const fn new_unchecked(inner: T, seal: B256) -> Self {
63 Self { inner, seal }
64 }
65
66 pub const fn as_sealed_ref(&self) -> Sealed<&T> {
68 Sealed { inner: &self.inner, seal: self.seal }
69 }
70
71 #[allow(clippy::missing_const_for_fn)] pub fn into_parts(self) -> (T, B256) {
74 (self.inner, self.seal)
75 }
76
77 #[allow(clippy::missing_const_for_fn)] pub fn split(self) -> (T, B256) {
80 self.into_parts()
81 }
82
83 #[inline(always)]
85 pub fn clone_inner(&self) -> T
86 where
87 T: Clone,
88 {
89 self.inner.clone()
90 }
91
92 #[inline(always)]
94 pub const fn inner(&self) -> &T {
95 &self.inner
96 }
97
98 #[inline(always)]
102 #[doc(hidden)]
103 pub fn inner_mut(&mut self) -> &mut T {
104 &mut self.inner
105 }
106
107 #[inline(always)]
109 pub const fn seal(&self) -> B256 {
110 self.seal
111 }
112
113 #[inline(always)]
115 pub const fn hash(&self) -> B256 {
116 self.seal
117 }
118
119 #[inline(always)]
121 pub const fn hash_ref(&self) -> &B256 {
122 &self.seal
123 }
124
125 #[inline(always)]
127 #[allow(clippy::missing_const_for_fn)] pub fn into_inner(self) -> T {
129 self.inner
130 }
131
132 #[inline(always)]
135 #[allow(clippy::missing_const_for_fn)] pub fn unseal(self) -> T {
137 self.into_inner()
138 }
139}
140
141impl<T> Sealed<&T> {
142 pub fn cloned(self) -> Sealed<T>
144 where
145 T: Clone,
146 {
147 let Self { inner, seal } = self;
148 Sealed::new_unchecked(inner.clone(), seal)
149 }
150}
151
152impl<T> Default for Sealed<T>
153where
154 T: Sealable + Default,
155{
156 fn default() -> Self {
157 T::default().seal_slow()
158 }
159}
160
161#[cfg(feature = "arbitrary")]
162impl<'a, T> arbitrary::Arbitrary<'a> for Sealed<T>
163where
164 T: for<'b> arbitrary::Arbitrary<'b> + Sealable,
165{
166 fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
167 Ok(T::arbitrary(u)?.seal_slow())
168 }
169}
170
171pub trait Sealable: Sized {
173 fn hash_slow(&self) -> B256;
175
176 fn seal_slow(self) -> Sealed<Self> {
178 Sealed::new(self)
179 }
180
181 fn seal_ref_slow(&self) -> Sealed<&Self> {
183 Sealed::new_ref(self)
184 }
185
186 fn seal_unchecked(self, seal: B256) -> Sealed<Self> {
188 Sealed::new_unchecked(self, seal)
189 }
190
191 fn seal_ref_unchecked(&self, seal: B256) -> Sealed<&Self> {
193 Sealed::new_unchecked(self, seal)
194 }
195}