use crate::system; use iced_futures::MaybeSend; use std::fmt; /// An operation to be performed on the system. pub enum Action { /// Query system information and produce `T` with the result. QueryInformation(Box>), } pub trait Closure: Fn(system::Information) -> T + MaybeSend {} impl Closure for T where T: Fn(system::Information) -> O + MaybeSend {} impl Action { /// Maps the output of a system [`Action`] using the provided closure. pub fn map( self, f: impl Fn(T) -> A + 'static + MaybeSend + Sync, ) -> Action where T: 'static, { match self { Self::QueryInformation(o) => { Action::QueryInformation(Box::new(move |s| f(o(s)))) } } } } impl fmt::Debug for Action { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::QueryInformation(_) => write!(f, "Action::QueryInformation"), } } }