use crate::{PercyDom, VirtualNode};
use std::{cell::Cell, rc::Rc};
use wasm_bindgen::JsCast;
use wasm_bindgen::prelude::Closure;
pub fn create_render_scheduler<F: FnMut() -> VirtualNode<web_sys::Window> + 'static>(
mut percy_dom: PercyDom,
mut render: F,
) -> Box<dyn FnMut()> {
let render_is_scheduled = Rc::new(Cell::new(false));
let render_is_scheduled_clone = render_is_scheduled.clone();
let render = move || {
render_is_scheduled.set(false);
let vdom = render();
percy_dom.update(vdom);
};
let render = Box::new(render) as Box<dyn FnMut()>;
let render = Closure::wrap(render);
let window = web_sys::window().unwrap();
let render_raf = move || {
if render_is_scheduled_clone.get() {
return;
}
render_is_scheduled_clone.set(true);
window
.request_animation_frame(render.as_ref().as_ref().unchecked_ref())
.unwrap();
};
Box::new(render_raf) as Box<dyn FnMut() -> ()>
}