UNPKG

bucklescript-tea

Version:
295 lines (285 loc) 9.65 kB
// Generated by BUCKLESCRIPT, PLEASE EDIT WITH CARE 'use strict'; var Web = require("./web.js"); var List = require("bs-platform/lib/js/list.js"); var Vdom = require("./vdom.js"); var Curry = require("bs-platform/lib/js/curry.js"); var Tea_cmd = require("./tea_cmd.js"); var Tea_sub = require("./tea_sub.js"); var Caml_option = require("bs-platform/lib/js/caml_option.js"); var Caml_builtin_exceptions = require("bs-platform/lib/js/caml_builtin_exceptions.js"); function programStateWrapper(initModel, pump, shutdown) { var model = { contents: initModel }; var callbacks = { contents: { enqueue: (function (_msg) { console.log("INVALID enqueue CALL!"); return /* () */0; }), on: (function (param) { return /* () */0; }) } }; var pumperInterface = Curry._1(pump, callbacks); var pending = { contents: undefined }; var handler = function (msg) { var match = pending.contents; if (match !== undefined) { pending.contents = /* :: */[ msg, match ]; return /* () */0; } else { pending.contents = /* [] */0; var newModel = Curry._2(pumperInterface.handleMsg, model.contents, msg); model.contents = newModel; var match$1 = pending.contents; if (match$1 !== undefined) { var msgs = match$1; if (msgs) { pending.contents = undefined; return List.iter(handler, List.rev(msgs)); } else { pending.contents = undefined; return /* () */0; } } else { throw [ Caml_builtin_exceptions.failure, "INVALID message queue state, should never be None during message processing!" ]; } } }; var render_events = { contents: /* [] */0 }; var finalizedCBs_enqueue = handler; var finalizedCBs_on = function (param) { if (typeof param === "number") { return List.iter(handler, render_events.contents); } else if (param.tag) { var msg = param[0]; render_events.contents = List.filter((function (mg) { return msg !== mg; }))(render_events.contents); return /* () */0; } else { render_events.contents = List.append(render_events.contents, /* :: */[ param[0], /* [] */0 ]); return /* () */0; } }; var finalizedCBs = { enqueue: finalizedCBs_enqueue, on: finalizedCBs_on }; callbacks.contents = finalizedCBs; var pi_requestShutdown = function (param) { callbacks.contents = { enqueue: (function (_msg) { console.log("INVALID message enqueued when shut down"); return /* () */0; }), on: (function (param) { return /* () */0; }) }; var cmd = Curry._1(shutdown, model.contents); Curry._1(pumperInterface.shutdown, cmd); return /* () */0; }; var render_string = function (param) { return Curry._1(pumperInterface.render_string, model.contents); }; Curry._1(pumperInterface.startup, /* () */0); return { pushMsg: handler, shutdown: pi_requestShutdown, getHtmlString: render_string }; } function programLoop(update, view, subscriptions, initModel, initCmd, param) { if (param !== undefined) { var parentNode = Caml_option.valFromOption(param); return (function (callbacks) { var priorRenderedVdom = { contents: /* [] */0 }; var latestModel = { contents: initModel }; var nextFrameID = { contents: undefined }; var doRender = function (_delta) { var match = nextFrameID.contents; if (match !== undefined) { var newVdom_000 = Curry._1(view, latestModel.contents); var newVdom = /* :: */[ newVdom_000, /* [] */0 ]; var justRenderedVdom = Vdom.patchVNodesIntoElement(callbacks, parentNode, priorRenderedVdom.contents, newVdom); priorRenderedVdom.contents = justRenderedVdom; Curry._1(callbacks.contents.on, /* Render */0); nextFrameID.contents = undefined; return /* () */0; } else { return /* () */0; } }; var scheduleRender = function (param) { var match = nextFrameID.contents; if (match !== undefined) { return /* () */0; } else { var id = window.requestAnimationFrame(doRender); nextFrameID.contents = id; return /* () */0; } }; var clearPnode = function (param) { while(parentNode.childNodes.length > 0) { var match = parentNode.firstChild; if (match !== null) { parentNode.removeChild(match); } }; return /* () */0; }; var oldSub = { contents: /* NoSub */0 }; var handleSubscriptionChange = function (model) { var newSub = Curry._1(subscriptions, model); oldSub.contents = Tea_sub.run(callbacks, callbacks, oldSub.contents, newSub); return /* () */0; }; var handlerStartup = function (param) { clearPnode(/* () */0); Tea_cmd.run(callbacks, initCmd); handleSubscriptionChange(latestModel.contents); nextFrameID.contents = -1; doRender(16); return /* () */0; }; var render_string = function (model) { return Vdom.renderToHtmlString(Curry._1(view, model)); }; var handler = function (model, msg) { var match = Curry._2(update, model, msg); var newModel = match[0]; latestModel.contents = newModel; Tea_cmd.run(callbacks, match[1]); scheduleRender(/* () */0); handleSubscriptionChange(newModel); return newModel; }; var handlerShutdown = function (cmd) { nextFrameID.contents = undefined; Tea_cmd.run(callbacks, cmd); oldSub.contents = Tea_sub.run(callbacks, callbacks, oldSub.contents, /* NoSub */0); priorRenderedVdom.contents = /* [] */0; clearPnode(/* () */0); return /* () */0; }; return { startup: handlerStartup, render_string: render_string, handleMsg: handler, shutdown: handlerShutdown }; }); } else { return (function (callbacks) { var oldSub = { contents: /* NoSub */0 }; var handleSubscriptionChange = function (model) { var newSub = Curry._1(subscriptions, model); oldSub.contents = Tea_sub.run(callbacks, callbacks, oldSub.contents, newSub); return /* () */0; }; return { startup: (function (param) { Tea_cmd.run(callbacks, initCmd); handleSubscriptionChange(initModel); return /* () */0; }), render_string: (function (model) { return Vdom.renderToHtmlString(Curry._1(view, model)); }), handleMsg: (function (model, msg) { var match = Curry._2(update, model, msg); var newModel = match[0]; Tea_cmd.run(callbacks, match[1]); handleSubscriptionChange(newModel); return newModel; }), shutdown: (function (cmd) { Tea_cmd.run(callbacks, cmd); oldSub.contents = Tea_sub.run(callbacks, callbacks, oldSub.contents, /* NoSub */0); return /* () */0; }) }; }); } } function program(param, pnode, flags) { Web.polyfills(/* () */0); var match = Curry._1(param.init, flags); var initModel = match[0]; var opnode = (pnode == null) ? undefined : Caml_option.some(pnode); var pumpInterface = programLoop(param.update, param.view, param.subscriptions, initModel, match[1], opnode); return programStateWrapper(initModel, pumpInterface, param.shutdown); } function standardProgram(param, pnode, args) { return program({ init: param.init, update: param.update, view: param.view, subscriptions: param.subscriptions, shutdown: (function (_model) { return /* NoCmd */0; }) }, pnode, args); } function beginnerProgram(param, pnode, param$1) { var update = param.update; var model = param.model; return standardProgram({ init: (function (param) { return /* tuple */[ model, /* NoCmd */0 ]; }), update: (function (model, msg) { return /* tuple */[ Curry._2(update, model, msg), /* NoCmd */0 ]; }), view: param.view, subscriptions: (function (_model) { return /* NoSub */0; }) }, pnode, /* () */0); } var map = Vdom.map; exports.programStateWrapper = programStateWrapper; exports.programLoop = programLoop; exports.program = program; exports.standardProgram = standardProgram; exports.beginnerProgram = beginnerProgram; exports.map = map; /* No side effect */