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(GUB, GUC) :: {app,
{GUB, lustre@cmd:cmd(GUC)},
fun((GUB, GUC) -> {GUB, lustre@cmd:cmd(GUC)}),
fun((GUB) -> lustre@element:element(GUC))}.
-type error() :: element_not_found.
-spec element(lustre@element:element(GUJ)) -> app(nil, GUJ).
element(Element) ->
Init = {nil, lustre@cmd:none()},
Update = fun(_, _) -> {nil, lustre@cmd:none()} end,
Render = fun(_) -> Element end,
{app, Init, Update, Render}.
-spec simple(
GUN,
fun((GUN, GUO) -> GUN),
fun((GUN) -> lustre@element:element(GUO))
) -> app(GUN, GUO).
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(
{GUS, lustre@cmd:cmd(GUT)},
fun((GUS, GUT) -> {GUS, lustre@cmd:cmd(GUT)}),
fun((GUS) -> lustre@element:element(GUT))
) -> app(GUS, GUT).
application(Init, Update, Render) ->
{app, Init, Update, Render}.
-spec start(app(any(), GVC), binary()) -> gleam@javascript@promise:promise(fun((GVC) -> nil)).
start(App, Selector) ->
'.@lustre.ffi.mjs':mount(App, Selector).