aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 0c767e7..80d089a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -12,14 +12,31 @@ mod point;
mod state;
struct RenderLoop {
- closure: Option<Closure<dyn FnMut(f64)>>,
+ inner: Rc<RefCell<Option<Closure<dyn FnMut(f64)>>>>,
}
impl RenderLoop {
- pub fn new() -> Self {
- Self {
- closure: None,
- }
+ fn new<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Self {
+ let inner = Rc::new(RefCell::new(None));
+ let rloop = inner.clone();
+
+ *inner.borrow_mut() = Some(Closure::new(move |t| {
+ if fun(t) {
+ request_animation_frame(rloop.borrow().as_ref().expect("can borrow rloop"));
+ }
+ }));
+ Self { inner }
+ }
+
+ fn start(&self) -> Result<(), JsValue> {
+ request_animation_frame(self.inner.borrow().as_ref().ok_or("closure exists")?);
+ Ok(())
+ }
+}
+
+impl Clone for RenderLoop {
+ fn clone(&self) -> Self {
+ Self { inner: self.inner.clone() }
}
}
@@ -58,19 +75,6 @@ fn request_animation_frame(f: &Closure<dyn FnMut(f64)>) {
.expect("should register `requestAnimationFrame` OK");
}
-fn rloop2<T: FnMut(f64) -> bool + 'static>(mut fun: T) -> Rc<RefCell<RenderLoop>> {
- let res = Rc::new(RefCell::new(RenderLoop::new()));
- let rloop = res.clone();
-
- (*res).borrow_mut().closure = Some(Closure::new(move |t| {
- if fun(t) {
- request_animation_frame(rloop.borrow().closure.as_ref().expect("can borrow rloop"));
- }
- }));
-
- res
-}
-
#[wasm_bindgen(start)]
pub fn init() -> Result<(), JsValue> {
console_log::init_with_level(Level::Debug).expect("couldn't init console log");
@@ -82,11 +86,11 @@ pub fn init() -> Result<(), JsValue> {
let mut s = State::new(canvas()?, fps()?)?;
s.render_frame(0.0)?;
- let render_loop = rloop2(move |t| {
+ let render_loop = RenderLoop::new(move |t| {
s.render_frame(t).expect("should render frame");
!*paused.lock().unwrap()
});
- request_animation_frame(render_loop.borrow().closure.as_ref().expect("can borrow res"));
+ render_loop.start()?;
let a = Closure::<dyn FnMut()>::new(move || {
let mut p = p1.lock().unwrap();
@@ -95,7 +99,7 @@ pub fn init() -> Result<(), JsValue> {
let text = if *p {
"go"
} else {
- request_animation_frame(render_loop.borrow().closure.as_ref().expect("render closure exists"));
+ render_loop.start().expect("start render loop");
"pause"
};
go().expect("go button works").set_text_content(Some(text));