Skip to content

Commit 8a1c3da

Browse files
committed
Add renderCallback
1 parent d7c1e39 commit 8a1c3da

File tree

6 files changed

+82
-18
lines changed

6 files changed

+82
-18
lines changed

src-ocaml/tea_app.ml

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type ('flags, 'model, 'msg) program = {
3333
init : 'flags -> 'model * 'msg Tea_cmd.t;
3434
update : 'model -> 'msg -> 'model * 'msg Tea_cmd.t;
3535
view : 'model -> 'msg Vdom.t;
36+
renderCallback: 'model -> unit;
3637
subscriptions : 'model -> 'msg Tea_sub.t;
3738
shutdown : 'model -> 'msg Tea_cmd.t;
3839
}
@@ -42,6 +43,7 @@ type ('flags, 'model, 'msg) standardProgram = {
4243
init : 'flags -> 'model * 'msg Tea_cmd.t;
4344
update : 'model -> 'msg -> 'model * 'msg Tea_cmd.t;
4445
view : 'model -> 'msg Vdom.t;
46+
renderCallback: 'model -> unit;
4547
subscriptions : 'model -> 'msg Tea_sub.t;
4648
}
4749

@@ -132,7 +134,7 @@ let programStateWrapper initModel pump shutdown =
132134
~getHtmlString:render_string
133135

134136

135-
let programLoop update view subscriptions initModel initCmd = function
137+
let programLoop update view renderCallback subscriptions initModel initCmd = function
136138
| None -> fun callbacks ->
137139
let oldSub = ref Tea_sub.none in
138140
let handleSubscriptionChange model =
@@ -177,6 +179,7 @@ let programLoop update view subscriptions initModel initCmd = function
177179
| Some _id ->
178180
let newVdom = [view !latestModel] in
179181
let justRenderedVdom = Vdom.patchVNodesIntoElement callbacks parentNode !priorRenderedVdom newVdom in
182+
let () = renderCallback !latestModel in
180183
let () = priorRenderedVdom := justRenderedVdom in
181184
(* let () = Vdom.patchVNodesIntoElement callbacks parentNode !priorRenderedVdom !lastVdom in
182185
let () = priorRenderedVdom := (!lastVdom) in *)
@@ -256,20 +259,21 @@ let programLoop update view subscriptions initModel initCmd = function
256259

257260

258261
let program : ('flags, 'model, 'msg) program -> Web.Node.t Js.null_undefined -> 'flags -> 'msg programInterface =
259-
fun {init; update; view; subscriptions; shutdown} pnode flags ->
262+
fun {init; update; view; renderCallback; subscriptions; shutdown} pnode flags ->
260263
let () = Web.polyfills () in
261264
let initModel, initCmd = init flags in
262265
let opnode = Js.Nullable.toOption pnode in
263-
let pumpInterface = programLoop update view subscriptions initModel initCmd opnode in
266+
let pumpInterface = programLoop update view renderCallback subscriptions initModel initCmd opnode in
264267
programStateWrapper initModel pumpInterface shutdown
265268

266269

267270
let standardProgram : ('flags, 'model, 'msg) standardProgram -> Web.Node.t Js.null_undefined -> 'flags -> 'msg programInterface =
268-
fun {init; update; view; subscriptions} pnode args ->
271+
fun {init; update; view; renderCallback; subscriptions} pnode args ->
269272
program {
270273
init = init;
271274
update = update;
272275
view = view;
276+
renderCallback = renderCallback;
273277
subscriptions = subscriptions;
274278
shutdown = fun _model -> Tea_cmd.none
275279
} pnode args
@@ -281,6 +285,7 @@ let beginnerProgram : ('model, 'msg) beginnerProgram -> Web.Node.t Js.null_undef
281285
init = (fun () -> (model, Tea_cmd.none));
282286
update = (fun model msg -> (update model msg, Tea_cmd.none));
283287
view = view;
288+
renderCallback= (fun _ -> ());
284289
subscriptions = (fun _model -> Tea_sub.none)
285290
} pnode ()
286291

src-ocaml/tea_debug.ml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ let debug :
2020
('flags, 'model debug_model, 'msg debug_msg) Tea_app.program
2121
=
2222
let client_msg msg = ClientMsg msg in
23-
fun string_of_msg { init; update; view; subscriptions; shutdown } ->
23+
fun string_of_msg { init; update; view; renderCallback; subscriptions; shutdown } ->
2424
let init' (flags : 'flags) =
2525
let cmodel, cmd = init flags in
2626
{
@@ -245,6 +245,10 @@ let debug :
245245
]
246246
in
247247

248+
let renderCallback' model =
249+
model.history |> List.hd |> snd |> renderCallback
250+
in
251+
248252
let subscriptions' model =
249253
model.history |> List.hd |> snd |> subscriptions |> Tea_sub.map client_msg
250254
in
@@ -257,6 +261,7 @@ let debug :
257261
init = init';
258262
update = update';
259263
view = view';
264+
renderCallback = renderCallback';
260265
subscriptions = subscriptions';
261266
shutdown = shutdown';
262267
}
@@ -275,6 +280,7 @@ let beginnerProgram :
275280
init = (fun () -> model, Tea_cmd.none);
276281
update = (fun model msg -> update model msg, Tea_cmd.none);
277282
view;
283+
renderCallback= (fun _ -> ());
278284
subscriptions = (fun _model -> Tea_sub.none);
279285
shutdown = (fun _model -> Tea_cmd.none);
280286
}
@@ -287,13 +293,14 @@ let standardProgram :
287293
Web.Node.t Js.null_undefined ->
288294
'flags ->
289295
'msg debug_msg Tea_app.programInterface
290-
= fun { init; update; view; subscriptions } string_of_msg pnode flags ->
296+
= fun { init; update; renderCallback; view; subscriptions } string_of_msg pnode flags ->
291297
let debugged = debug
292298
string_of_msg
293299
{
294300
init;
295301
update;
296302
view;
303+
renderCallback;
297304
subscriptions;
298305
shutdown = (fun _model -> Tea_cmd.none);
299306
}
@@ -306,13 +313,14 @@ let program :
306313
Web.Node.t Js.null_undefined ->
307314
'flags ->
308315
'msg debug_msg Tea_app.programInterface
309-
= fun { init; update; view; subscriptions; shutdown } string_of_msg pnode flags ->
316+
= fun { init; update; view; renderCallback; subscriptions; shutdown } string_of_msg pnode flags ->
310317
let debugged = debug
311318
string_of_msg
312319
{
313320
init;
314321
update;
315322
view;
323+
renderCallback;
316324
subscriptions;
317325
shutdown;
318326
}

src-ocaml/tea_navigation.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ type ('flags, 'model, 'msg) navigationProgram =
44
; update : 'model -> 'msg -> 'model * 'msg Tea_cmd.t
55
; view : 'model -> 'msg Vdom.t
66
; subscriptions : 'model -> 'msg Tea_sub.t
7+
; renderCallback : 'model -> unit
78
; shutdown : 'model -> 'msg Tea_cmd.t
89
}
910

@@ -80,5 +81,6 @@ let navigationProgram locationToMessage stuff =
8081
; update = stuff.update
8182
; view = stuff.view
8283
; subscriptions = subscriptions
84+
; renderCallback = stuff.renderCallback
8385
; shutdown = stuff.shutdown
8486
}

src-reason/tea_app.re

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type program('flags, 'model, 'msg) = {
3131
init: 'flags => ('model, Tea_cmd.t('msg)),
3232
update: ('model, 'msg) => ('model, Tea_cmd.t('msg)),
3333
view: 'model => Vdom.t('msg),
34+
renderCallback: 'model => unit,
3435
subscriptions: 'model => Tea_sub.t('msg),
3536
shutdown: 'model => Tea_cmd.t('msg),
3637
};
@@ -39,6 +40,7 @@ type standardProgram('flags, 'model, 'msg) = {
3940
init: 'flags => ('model, Tea_cmd.t('msg)),
4041
update: ('model, 'msg) => ('model, Tea_cmd.t('msg)),
4142
view: 'model => Vdom.t('msg),
43+
renderCallback: 'model => unit,
4244
subscriptions: 'model => Tea_sub.t('msg),
4345
};
4446

@@ -58,7 +60,7 @@ type pumpInterface('model, 'msg) = {
5860
type programInterface('msg) = {. "pushMsg": 'msg => unit};
5961

6062
[@bs.obj]
61-
external makeProgramInterface :
63+
external makeProgramInterface:
6264
(
6365
~pushMsg: 'msg => unit,
6466
~shutdown: unit => unit,
@@ -135,7 +137,8 @@ let programStateWrapper = (initModel, pump, shutdown) => {
135137
);
136138
};
137139

138-
let programLoop = (update, view, subscriptions, initModel, initCmd) =>
140+
let programLoop =
141+
(update, view, renderCallback, subscriptions, initModel, initCmd) =>
139142
fun
140143
| None => (
141144
callbacks => {
@@ -192,6 +195,7 @@ let programLoop = (update, view, subscriptions, initModel, initCmd) =>
192195
priorRenderedVdom^,
193196
newVdom,
194197
);
198+
let () = renderCallback(latestModel^);
195199
let () = priorRenderedVdom := justRenderedVdom;
196200
/* let () = Vdom.patchVNodesIntoElement callbacks parentNode !priorRenderedVdom !lastVdom in
197201
let () = priorRenderedVdom := (!lastVdom) in */
@@ -290,12 +294,24 @@ let programLoop = (update, view, subscriptions, initModel, initCmd) =>
290294
let program:
291295
(program('flags, 'model, 'msg), Js.null_undefined(Web.Node.t), 'flags) =>
292296
programInterface('msg) =
293-
({init, update, view, subscriptions, shutdown}, pnode, flags) => {
297+
(
298+
{init, update, view, renderCallback, subscriptions, shutdown},
299+
pnode,
300+
flags,
301+
) => {
294302
let () = Web.polyfills();
295303
let (initModel, initCmd) = init(flags);
296304
let opnode = Js.Nullable.toOption(pnode);
297305
let pumpInterface =
298-
programLoop(update, view, subscriptions, initModel, initCmd, opnode);
306+
programLoop(
307+
update,
308+
view,
309+
renderCallback,
310+
subscriptions,
311+
initModel,
312+
initCmd,
313+
opnode,
314+
);
299315
programStateWrapper(initModel, pumpInterface, shutdown);
300316
};
301317

@@ -306,9 +322,16 @@ let standardProgram:
306322
'flags
307323
) =>
308324
programInterface('msg) =
309-
({init, update, view, subscriptions}, pnode, args) =>
325+
({init, update, view, renderCallback, subscriptions}, pnode, args) =>
310326
program(
311-
{init, update, view, subscriptions, shutdown: _model => Tea_cmd.none},
327+
{
328+
init,
329+
update,
330+
view,
331+
renderCallback,
332+
subscriptions,
333+
shutdown: _model => Tea_cmd.none,
334+
},
312335
pnode,
313336
args,
314337
);
@@ -322,6 +345,7 @@ let beginnerProgram:
322345
init: () => (model, Tea_cmd.none),
323346
update: (model, msg) => (update(model, msg), Tea_cmd.none),
324347
view,
348+
renderCallback: _ => (),
325349
subscriptions: _model => Tea_sub.none,
326350
},
327351
pnode,

src-reason/tea_debug.re

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ let debug:
1818
('msg => string, Tea_app.program('flags, 'model, 'msg)) =>
1919
Tea_app.program('flags, debug_model('model), debug_msg('msg)) = {
2020
let client_msg = msg => ClientMsg(msg);
21-
(string_of_msg, {init, update, view, subscriptions, shutdown}) => {
21+
(
22+
string_of_msg,
23+
{init, update, view, renderCallback, subscriptions, shutdown},
24+
) => {
2225
let init' = (flags: 'flags) => {
2326
let (cmodel, cmd) = init(flags);
2427
(
@@ -383,6 +386,9 @@ let debug:
383386
);
384387
};
385388

389+
let renderCallback' = model =>
390+
model.history |> List.hd |> snd |> renderCallback;
391+
386392
let subscriptions' = model =>
387393
model.history
388394
|> List.hd
@@ -397,6 +403,7 @@ let debug:
397403
init: init',
398404
update: update',
399405
view: view',
406+
renderCallback: renderCallback',
400407
subscriptions: subscriptions',
401408
shutdown: shutdown',
402409
};
@@ -419,6 +426,7 @@ let beginnerProgram:
419426
init: () => (model, Tea_cmd.none),
420427
update: (model, msg) => (update(model, msg), Tea_cmd.none),
421428
view,
429+
renderCallback: _ => (),
422430
subscriptions: _model => Tea_sub.none,
423431
shutdown: _model => Tea_cmd.none,
424432
},
@@ -434,11 +442,23 @@ let standardProgram:
434442
'flags
435443
) =>
436444
Tea_app.programInterface(debug_msg('msg)) =
437-
({init, update, view, subscriptions}, string_of_msg, pnode, flags) => {
445+
(
446+
{init, update, renderCallback, view, subscriptions},
447+
string_of_msg,
448+
pnode,
449+
flags,
450+
) => {
438451
let debugged =
439452
debug(
440453
string_of_msg,
441-
{init, update, view, subscriptions, shutdown: _model => Tea_cmd.none},
454+
{
455+
init,
456+
update,
457+
view,
458+
renderCallback,
459+
subscriptions,
460+
shutdown: _model => Tea_cmd.none,
461+
},
442462
);
443463
Tea_app.program(debugged, pnode, flags);
444464
};
@@ -452,12 +472,15 @@ let program:
452472
) =>
453473
Tea_app.programInterface(debug_msg('msg)) =
454474
(
455-
{init, update, view, subscriptions, shutdown},
475+
{init, update, view, renderCallback, subscriptions, shutdown},
456476
string_of_msg,
457477
pnode,
458478
flags,
459479
) => {
460480
let debugged =
461-
debug(string_of_msg, {init, update, view, subscriptions, shutdown});
481+
debug(
482+
string_of_msg,
483+
{init, update, view, renderCallback, subscriptions, shutdown},
484+
);
462485
Tea_app.program(debugged, pnode, flags);
463486
};

src-reason/tea_navigation.re

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ type navigationProgram('flags, 'model, 'msg) = {
33
update: ('model, 'msg) => ('model, Tea_cmd.t('msg)),
44
view: 'model => Vdom.t('msg),
55
subscriptions: 'model => Tea_sub.t('msg),
6+
renderCallback: 'model => unit,
67
shutdown: 'model => Tea_cmd.t('msg),
78
};
89

@@ -80,6 +81,7 @@ let navigationProgram = (locationToMessage, stuff) => {
8081
update: stuff.update,
8182
view: stuff.view,
8283
subscriptions,
84+
renderCallback: stuff.renderCallback,
8385
shutdown: stuff.shutdown,
8486
});
8587
};

0 commit comments

Comments
 (0)