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