#[derive(Debug, Clone, Copy)]
pub struct WithSlot<T> {
slot: u64,
value: T,
}
impl<T> WithSlot<T> {
pub fn new(slot: u64, value: T) -> Self {
Self { slot, value }
}
pub fn slot(&self) -> u64 {
self.slot
}
pub fn slot_mut(&mut self) -> &mut u64 {
&mut self.slot
}
pub fn value(&self) -> &T {
&self.value
}
pub fn value_mut(&mut self) -> &mut T {
&mut self.value
}
pub fn into_value(self) -> T {
self.split().1
}
pub fn map<U>(self, f: impl FnOnce(T) -> U) -> WithSlot<U> {
WithSlot {
slot: self.slot,
value: (f)(self.value),
}
}
pub fn split(self) -> (u64, T) {
(self.slot, self.value)
}
}
impl<T, E> WithSlot<Result<T, E>> {
pub fn transpose(self) -> Result<WithSlot<T>, E> {
match self.value {
Ok(value) => Ok(WithSlot {
slot: self.slot,
value,
}),
Err(err) => Err(err),
}
}
}