use std::rc::Rc;
use wasm_bindgen::JsValue;
use web_sys::Element;
use crate::expr::{self, Spanned};
use crate::mount::track_effect_on;
use crate::reactive::effect;
use crate::scope::with_current_el;
pub fn install(el: &Element, proxy: &JsValue, ast: Spanned<expr::Expr>) {
install_eval(el, proxy, Rc::new(move |scope| expr::evaluate(&ast, scope)));
}
#[doc(hidden)]
pub fn install_eval(el: &Element, proxy: &JsValue, evaluator: Rc<dyn Fn(&JsValue) -> JsValue>) {
let el_owned = el.clone();
let proxy_owned = proxy.clone();
let id = effect(move || {
with_current_el(&el_owned.clone(), || {
let v = evaluator(&proxy_owned);
let s = v.as_string().unwrap_or_default();
el_owned.set_inner_html(&s);
});
});
track_effect_on(el, id);
}