-module(lustre). -compile(no_auto_import). -export([element/1, simple/3, application/3, start/2]). -export_type([app/2, error/0]). -opaque app(GEV, GEW) :: {app, {GEV, lustre@cmd:cmd(GEW)}, fun((GEV, GEW) -> {GEV, lustre@cmd:cmd(GEW)}), fun((GEV) -> lustre@element:element(GEW))}. -type error() :: element_not_found. -spec element(lustre@element:element(GFN)) -> app(nil, GFN). element(Element) -> Init = {nil, lustre@cmd:none()}, Update = fun(_, _) -> {nil, lustre@cmd:none()} end, Render = fun(_) -> Element end, {app, Init, Update, Render}. -spec simple( GFR, fun((GFR, GFS) -> GFR), fun((GFR) -> lustre@element:element(GFS)) ) -> app(GFR, GFS). 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( {GFW, lustre@cmd:cmd(GFX)}, fun((GFW, GFX) -> {GFW, lustre@cmd:cmd(GFX)}), fun((GFW) -> lustre@element:element(GFX)) ) -> app(GFW, GFX). application(Init, Update, Render) -> {app, Init, Update, Render}. -spec start(app(any(), GGG), binary()) -> {ok, fun((GGG) -> nil)} | {error, error()}. start(App, Selector) -> _pipe = '.@ffi.mjs':mount(App, Selector), gleam@result:replace_error(_pipe, element_not_found).