on master help sign in
reuse context
a2873aeiko
wock-web/src/lib.rs+22−9
@@ -1,7 +1,12 @@
1#![feature(iter_collect_into)]
1#![feature(iter_collect_into)]
2mod utils;
2mod utils;
3
3
4−use std::rc::Rc;
4+use std::{
5+ borrow::BorrowMut,
6+ cell::RefCell,
7+ ops::{Deref, DerefMut},
8+ rc::Rc,
9+};
5
10
6use dodrio::{
11use dodrio::{
7 bumpalo::{self, Bump},
12 bumpalo::{self, Bump},
@@ -9,7 +14,7 @@ use dodrio::{
9};
14};
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},
14};
19};
15use wasm_bindgen::prelude::*;
20use wasm_bindgen::prelude::*;
@@ -26,15 +31,14 @@ extern "C" {
26
31
27struct WockApp {
32struct WockApp {
28 nock: Rc<Noun>,
33 nock: Rc<Noun>,
34+ ctx: RefCell<InterpreterContext>,
29 model: Rc<Noun>,
35 model: Rc<Noun>,
30}
36}
31
37
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();
35−
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),
40 )
44 )
@@ -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();
81−
82 let app = root.unwrap_mut::<WockApp>();
83 let app = root.unwrap_mut::<WockApp>();
83
84
85+ let mut ctx = app.ctx.borrow_mut();
86+
87+ let sig = ctx.nouns.sig.clone();
88+
84 let new_model = slam(
89 let new_model = slam(
85 &mut ctx,
90 &mut ctx,
86 &app.nock,
91 &app.nock,
@@ -151,7 +156,15 @@ pub async fn main(path: &str) {
151 )
156 )
152 .unwrap();
157 .unwrap();
153
158
154− dodrio::Vdom::new(&output_el, WockApp { nock, model }).forget();
159+ dodrio::Vdom::new(
160+ &output_el,
161+ WockApp {
162+ nock,
163+ model,
164+ ctx: RefCell::new(ctx),
165+ },
166+ )
167+ .forget();
155}
168}
156
169
157pub async fn load_nock(path: &str) -> Rc<Noun> {
170pub async fn load_nock(path: &str) -> Rc<Noun> {