use crate::B256;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Sealed<T> {
inner: T,
seal: B256,
}
impl<T> core::ops::Deref for Sealed<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
self.inner()
}
}
impl<T> Sealed<T> {
pub const fn new_unchecked(inner: T, seal: B256) -> Self {
Self { inner, seal }
}
#[allow(clippy::missing_const_for_fn)] pub fn into_parts(self) -> (T, B256) {
(self.inner, self.seal)
}
#[allow(clippy::missing_const_for_fn)] pub fn split(self) -> (T, B256) {
self.into_parts()
}
#[inline(always)]
pub const fn inner(&self) -> &T {
&self.inner
}
#[inline(always)]
pub const fn seal(&self) -> B256 {
self.seal
}
#[inline(always)]
#[allow(clippy::missing_const_for_fn)] pub fn into_inner(self) -> T {
self.inner
}
#[inline(always)]
#[allow(clippy::missing_const_for_fn)] pub fn unseal(self) -> T {
self.into_inner()
}
}
pub trait Sealable: Sized {
fn hash_slow(&self) -> B256;
fn seal_slow(self) -> Sealed<Self> {
let seal = self.hash_slow();
Sealed::new_unchecked(self, seal)
}
fn seal_unchecked(self, seal: B256) -> Sealed<Self> {
Sealed::new_unchecked(self, seal)
}
}