use std::error::Error;
use std::sync::{Arc, MutexGuard};
use std::time::Duration;
use crate::events::event::{EventHandle, EventState};
use crate::waiters::waiter::{Signaler, WaitList};
use crate::{wait_one, Event};
struct PulseEventInfo {
waiters: WaitList,
}
impl PulseEventInfo {
fn new() -> PulseEventInfo {
PulseEventInfo {
waiters: WaitList::new(),
}
}
}
impl EventState for PulseEventInfo {
fn is_set(&self) -> bool {
false
}
fn set(&self) {
self.waiters.fire()
}
fn clear(&self) {
self.waiters.clear()
}
fn register_signaler(
&self,
pos: usize,
signaler: Arc<dyn Signaler>,
) -> Result<(), Box<dyn Error>> {
if self.is_set() {
signaler.fire(pos)?;
}
self.waiters.register_signaler(pos, signaler)
}
fn remove_signaler(&self, signaler: &Arc<dyn Signaler>) -> Result<(), Box<dyn Error>> {
self.waiters.remove_signaler(signaler)
}
fn wake_lock(&self) -> Result<Option<MutexGuard<()>>, Box<dyn Error>> {
Ok(None)
}
fn can_consume(&self) -> bool {
true
}
fn consume(&self) {}
}
#[derive(Clone)]
pub struct PulseEvent {
info: Arc<EventHandle>,
}
impl PulseEvent {
pub fn new() -> PulseEvent {
let state: Box<dyn EventState> = Box::new(PulseEventInfo::new());
PulseEvent {
info: Arc::new(EventHandle::new(state)),
}
}
pub fn is_set(&self) -> bool {
self.info.is_set()
}
pub fn set(&self) {
self.info.set()
}
pub fn clear(&self) {
self.info.clear()
}
pub fn wait(&self, dur: Duration) -> Result<bool, Box<dyn Error>> {
wait_one(self, dur)
}
}
impl Event for PulseEvent {
fn handle(&self) -> &Arc<EventHandle> {
&self.info
}
}