use std::time::Duration;
use crate::Task;
pub struct Effect<M> {
task: Task<M>,
popover: Option<PopoverRequest>,
nudge: Option<NudgeRequest>,
}
#[doc(hidden)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PopoverRequest {
Open,
Close,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Nudge {
Up,
Down,
Left,
Right,
}
#[doc(hidden)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NudgeRequest {
pub nudge: Nudge,
pub lasting: Option<Duration>,
}
impl From<Nudge> for NudgeRequest {
fn from(nudge: Nudge) -> Self {
Self {
nudge,
lasting: None,
}
}
}
impl<M> Effect<M> {
pub fn none() -> Self {
Self {
task: Task::none(),
popover: None,
nudge: None,
}
}
pub fn task(task: Task<M>) -> Self {
Self {
task,
popover: None,
nudge: None,
}
}
pub fn and_task(mut self, task: Task<M>) -> Self
where
M: Send + 'static,
{
self.task = Task::batch([self.task, task]);
self
}
pub fn open_popover(mut self) -> Self {
self.popover = Some(PopoverRequest::Open);
self
}
pub fn close_popover(mut self) -> Self {
self.popover = Some(PopoverRequest::Close);
self
}
pub fn nudge(mut self, nudge: Nudge) -> Self {
self.nudge = Some(NudgeRequest {
nudge,
lasting: None,
});
self
}
pub fn nudge_lasting(mut self, nudge: Nudge, lasting: Duration) -> Self {
self.nudge = Some(NudgeRequest {
nudge,
lasting: Some(lasting),
});
self
}
#[doc(hidden)]
pub fn into_parts(self) -> (Task<M>, Option<PopoverRequest>, Option<NudgeRequest>) {
(self.task, self.popover, self.nudge)
}
}
impl<M> From<Task<M>> for Effect<M> {
fn from(task: Task<M>) -> Self {
Self::task(task)
}
}