use crate::evm::FrameTr;
#[derive(Clone, Debug)]
pub enum ItemOrResult<ITEM, RES> {
Item(ITEM),
Result(RES),
}
impl<ITEM, RES> ItemOrResult<ITEM, RES> {
pub fn map_item<OITEM>(self, f: impl FnOnce(ITEM) -> OITEM) -> ItemOrResult<OITEM, RES> {
match self {
ItemOrResult::Item(item) => ItemOrResult::Item(f(item)),
ItemOrResult::Result(result) => ItemOrResult::Result(result),
}
}
#[deprecated(
note = "Use map_item() instead; this maps the Item variant (not necessarily a frame)"
)]
pub fn map_frame<OITEM>(self, f: impl FnOnce(ITEM) -> OITEM) -> ItemOrResult<OITEM, RES> {
self.map_item(f)
}
pub fn map_result<ORES>(self, f: impl FnOnce(RES) -> ORES) -> ItemOrResult<ITEM, ORES> {
match self {
ItemOrResult::Item(item) => ItemOrResult::Item(item),
ItemOrResult::Result(result) => ItemOrResult::Result(f(result)),
}
}
}
impl<ITEM, RES> ItemOrResult<ITEM, RES> {
pub fn is_result(&self) -> bool {
matches!(self, ItemOrResult::Result(_))
}
pub fn is_item(&self) -> bool {
matches!(self, ItemOrResult::Item(_))
}
}
pub type FrameInitOrResult<FRAME> =
ItemOrResult<<FRAME as FrameTr>::FrameInit, <FRAME as FrameTr>::FrameResult>;