Current section

Files

Jump to
lustre src lustre.erl
Raw

src/lustre.erl

-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).