-module(lustre). -compile([no_auto_import, nowarn_unused_vars]). -export([element/1, simple/3, application/3, start/2]). -export_type([app/2, error/0]). -opaque app(GNE, GNF) :: {app, {GNE, lustre@cmd:cmd(GNF)}, fun((GNE, GNF) -> {GNE, lustre@cmd:cmd(GNF)}), fun((GNE) -> lustre@element:element(GNF))}. -type error() :: element_not_found. -spec element(lustre@element:element(GNM)) -> app(nil, GNM). element(Element) -> Init = {nil, lustre@cmd:none()}, Update = fun(_, _) -> {nil, lustre@cmd:none()} end, Render = fun(_) -> Element end, {app, Init, Update, Render}. -spec simple( GNQ, fun((GNQ, GNR) -> GNQ), fun((GNQ) -> lustre@element:element(GNR)) ) -> app(GNQ, GNR). simple(Init, Update, Render) -> Init@1 = {Init, lustre@cmd:none()}, Update@1 = fun(Model, Msg) -> {Update(Model, Msg), lustre@cmd:none()} end, {app, Init@1, Update@1, Render}. -spec application( {GNV, lustre@cmd:cmd(GNW)}, fun((GNV, GNW) -> {GNV, lustre@cmd:cmd(GNW)}), fun((GNV) -> lustre@element:element(GNW)) ) -> app(GNV, GNW). application(Init, Update, Render) -> {app, Init, Update, Render}. -spec start(app(any(), GOF), binary()) -> {ok, fun((GOF) -> nil)} | {error, error()}. start(App, Selector) -> _pipe = '.@ffi.mjs':mount(App, Selector), gleam@result:replace_error(_pipe, element_not_found).