Current section

Files

Jump to
lustre src lustre.erl
Raw

src/lustre.erl

-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(GNY, GNZ) :: {app,
{GNY, lustre@cmd:cmd(GNZ)},
fun((GNY, GNZ) -> {GNY, lustre@cmd:cmd(GNZ)}),
fun((GNY) -> lustre@element:element(GNZ))}.
-type error() :: element_not_found.
-spec element(lustre@element:element(GOG)) -> app(nil, GOG).
element(Element) ->
Init = {nil, lustre@cmd:none()},
Update = fun(_, _) -> {nil, lustre@cmd:none()} end,
Render = fun(_) -> Element end,
{app, Init, Update, Render}.
-spec simple(
GOK,
fun((GOK, GOL) -> GOK),
fun((GOK) -> lustre@element:element(GOL))
) -> app(GOK, GOL).
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(
{GOP, lustre@cmd:cmd(GOQ)},
fun((GOP, GOQ) -> {GOP, lustre@cmd:cmd(GOQ)}),
fun((GOP) -> lustre@element:element(GOQ))
) -> app(GOP, GOQ).
application(Init, Update, Render) ->
{app, Init, Update, Render}.
-spec start(app(any(), GOZ), binary()) -> gleam@javascript@promise:promise(fun((GOZ) -> nil)).
start(App, Selector) ->
'.@lustre.ffi.mjs':mount(App, Selector).