use std::cell::RefCell; use std::rc::Rc; use wasm_bindgen::prelude::*; pub struct RenderLoop { inner: Rc>>, } impl RenderLoop { fn request_animation_frame(f: &Closure) { web_sys::window() .expect("no window") .request_animation_frame(f.as_ref().unchecked_ref()) .expect("should register `requestAnimationFrame` OK"); } pub fn new bool + 'static>(mut fun: T) -> Self { let inner = Rc::new(RefCell::new(Closure::new(|_| {}))); let rloop = inner.clone(); *inner.borrow_mut() = Closure::new(move |t| { if fun(t) { Self::request_animation_frame(&rloop.borrow()); } }); Self { inner } } pub fn start(&self) -> Result<(), JsValue> { Self::request_animation_frame(&self.inner.borrow()); Ok(()) } } impl Clone for RenderLoop { fn clone(&self) -> Self { Self { inner: self.inner.clone(), } } }