@@ -1,7 +1,12 @@
1#![feature(iter_collect_into)]
1#![feature(iter_collect_into)]
4−use std::rc::Rc;
4+use std::{
7+ ops::{Deref, DerefMut},
6use dodrio::{
11use dodrio::{
7 bumpalo::{self, Bump},
12 bumpalo::{self, Bump},
@@ -9,7 +14,7 @@ use dodrio::{
10use nock::{
15use nock::{
11 cue::cue_bytes,
16 cue::cue_bytes,
12− interpreter::{generate_interpreter_context, slam},
17+ interpreter::{generate_interpreter_context, slam, InterpreterContext},
13 noun::{cell, Noun},
18 noun::{cell, Noun},
15use wasm_bindgen::prelude::*;
20use wasm_bindgen::prelude::*;
@@ -26,15 +31,14 @@ extern "C" {
27struct WockApp {
32struct WockApp {
28 nock: Rc<Noun>,
33 nock: Rc<Noun>,
34+ ctx: RefCell<InterpreterContext>,
29 model: Rc<Noun>,
35 model: Rc<Noun>,
32impl<'a> Render<'a> for WockApp {
38impl<'a> Render<'a> for WockApp {
33 fn render(&self, cx: &mut dodrio::RenderContext<'a>) -> dodrio::Node<'a> {
39 fn render(&self, cx: &mut dodrio::RenderContext<'a>) -> dodrio::Node<'a> {
34− let mut ctx = generate_interpreter_context();
36 let sail = slam(
40 let sail = slam(
37− &mut ctx,
41+ &mut *self.ctx.borrow_mut(),
38 &self.nock,
42 &self.nock,
39 &cell(&Rc::new(Noun::from_bytes(b"view")), &self.model),
43 &cell(&Rc::new(Noun::from_bytes(b"view")), &self.model),
@@ -76,11 +80,12 @@ fn render_sail<'a>(ctx: &mut RenderContext<'a>, manx: Rc<Noun>) -> Node<'a> {
76 move |root: &mut dyn RootRender,
80 move |root: &mut dyn RootRender,
77 vdom: VdomWeak,
81 vdom: VdomWeak,
78 _event: web_sys::Event| {
82 _event: web_sys::Event| {
79− let mut ctx = generate_interpreter_context();
80− let sig = ctx.nouns.sig.clone();
82 let app = root.unwrap_mut::<WockApp>();
83 let app = root.unwrap_mut::<WockApp>();
85+ let mut ctx = app.ctx.borrow_mut();
87+ let sig = ctx.nouns.sig.clone();
84 let new_model = slam(
89 let new_model = slam(
86 &app.nock,
91 &app.nock,
@@ -151,7 +156,15 @@ pub async fn main(path: &str) {
152 .unwrap();
157 .unwrap();
154− dodrio::Vdom::new(&output_el, WockApp { nock, model }).forget();
159+ dodrio::Vdom::new(
164+ ctx: RefCell::new(ctx),
157pub async fn load_nock(path: &str) -> Rc<Noun> {
170pub async fn load_nock(path: &str) -> Rc<Noun> {