use stdweb::{unstable::TryInto, Once, Reference};
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "Object")]
pub struct OneShotTimeout(Reference);
impl OneShotTimeout {
pub fn new<F: 'static + FnOnce()>(callback: F, delay: i32) -> Self {
(js! {
let callback = @{Once(callback)};
let timeout = setTimeout(function() {
callback();
this.RUST_NODEJS_PRIVATE.callback.drop();
this.RUST_NODEJS_PRIVATE.callback = null;
}, @{delay});
timeout.RUST_NODEJS_PRIVATE = {
callback: callback
};
return timeout;
}).try_into()
.expect("setTimeout must return a Timeout object!")
}
pub fn reference(&self) -> &Self {
js! {
@(no_return)
@{self}.ref();
};
self
}
pub fn unreference(&self) -> &Self {
js! {
@(no_return)
@{self}.unref();
};
self
}
pub fn clear(&self) -> &Self {
js! {
@(no_return)
clearTimeout(@{self});
if (this.RUST_NODEJS_PRIVATE.callback !== null) {
this.RUST_NODEJS_PRIVATE.callback.drop();
this.RUST_NODEJS_PRIVATE.callback = null;
}
};
self
}
}
#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
#[reference(instance_of = "Object")]
pub struct RepeatableTimeout(Reference);
impl RepeatableTimeout {
pub fn new<F: 'static + Fn()>(callback: F, delay: i32) -> Self {
(js! {
let callback = @{callback};
let timeout = setTimeout(callback, @{delay});
timeout.RUST_NODEJS_PRIVATE = {
callback: callback
};
return timeout;
}).try_into()
.expect("setTimeout must return a Timeout object!")
}
pub fn dispose(&self) {
js! {
@(no_return)
@{self}.RUST_NODEJS_PRIVATE.callback.drop();
};
}
pub fn reference(&self) -> &Self {
js! {
@(no_return)
@{self}.ref();
};
self
}
pub fn unreference(&self) -> &Self {
js! {
@(no_return)
@{self}.unref();
};
self
}
pub fn refresh(&self) -> &Self {
js! {
@(no_return)
@{self}.refresh();
};
self
}
pub fn clear(&self) -> &Self {
js! {
@(no_return)
clearTimeout(@{self});
};
self
}
}
pub fn set_timeout<F: 'static + FnOnce()>(callback: F, delay: i32) -> OneShotTimeout {
OneShotTimeout::new(callback, delay)
}
pub fn clear_timeout<F: 'static + FnOnce()>(timeout: OneShotTimeout) {
timeout.clear();
}