Packages
lustre
4.2.3
5.7.1
5.7.0
5.6.0
5.5.2
5.5.1
5.5.0
5.4.0
5.3.5
5.3.4
5.3.3
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.1
5.1.0
5.0.3
5.0.2
5.0.1
5.0.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.0
4.0.0-rc1
4.0.0-rc.2
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.12
3.0.11
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.8
3.0.0-rc.7
3.0.0-rc.6
3.0.0-rc.5
3.0.0-rc.4
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.0.1
2.0.0
1.3.0
1.2.0
1.1.0
1.0.0
Create HTML templates, single page applications, Web Components, and real-time server components in Gleam!
Current section
Files
Jump to
Current section
Files
src/lustre.erl
-module(lustre).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([application/3, element/1, simple/3, component/4, start_actor/2, start_server_component/2, register/2, dispatch/1, shutdown/0, is_browser/0, start/3, is_registered/1]).
-export_type([app/3, client_spa/0, server_component/0, error/0]).
-opaque app(PMI, PMJ, PMK) :: {app,
fun((PMI) -> {PMJ, lustre@effect:effect(PMK)}),
fun((PMJ, PMK) -> {PMJ, lustre@effect:effect(PMK)}),
fun((PMJ) -> lustre@internals@vdom:element(PMK)),
gleam@option:option(gleam@dict:dict(binary(), fun((gleam@dynamic:dynamic_()) -> {ok,
PMK} |
{error, list(gleam@dynamic:decode_error())})))}.
-type client_spa() :: any().
-type server_component() :: any().
-type error() :: {actor_error, gleam@otp@actor:start_error()} |
{bad_component_name, binary()} |
{component_already_registered, binary()} |
{element_not_found, binary()} |
not_a_browser |
not_erlang.
-spec application(
fun((PND) -> {PNE, lustre@effect:effect(PNF)}),
fun((PNE, PNF) -> {PNE, lustre@effect:effect(PNF)}),
fun((PNE) -> lustre@internals@vdom:element(PNF))
) -> app(PND, PNE, PNF).
application(Init, Update, View) ->
{app, Init, Update, View, none}.
-spec element(lustre@internals@vdom:element(PMR)) -> app(nil, nil, PMR).
element(Html) ->
Init = fun(_) -> {nil, lustre@effect:none()} end,
Update = fun(_, _) -> {nil, lustre@effect:none()} end,
View = fun(_) -> Html end,
application(Init, Update, View).
-spec simple(
fun((PMW) -> PMX),
fun((PMX, PMY) -> PMX),
fun((PMX) -> lustre@internals@vdom:element(PMY))
) -> app(PMW, PMX, PMY).
simple(Init, Update, View) ->
Init@1 = fun(Flags) -> {Init(Flags), lustre@effect:none()} end,
Update@1 = fun(Model, Msg) -> {Update(Model, Msg), lustre@effect:none()} end,
application(Init@1, Update@1, View).
-spec component(
fun((PNM) -> {PNN, lustre@effect:effect(PNO)}),
fun((PNN, PNO) -> {PNN, lustre@effect:effect(PNO)}),
fun((PNN) -> lustre@internals@vdom:element(PNO)),
gleam@dict:dict(binary(), fun((gleam@dynamic:dynamic_()) -> {ok, PNO} |
{error, list(gleam@dynamic:decode_error())}))
) -> app(PNM, PNN, PNO).
component(Init, Update, View, On_attribute_change) ->
{app, Init, Update, View, {some, On_attribute_change}}.
-spec do_start(app(POI, any(), POK), binary(), POI) -> {ok,
fun((lustre@internals@runtime:action(POK, client_spa())) -> nil)} |
{error, error()}.
do_start(_, _, _) ->
{error, not_a_browser}.
-spec do_start_actor(app(PPN, any(), PPP), PPN) -> {ok,
gleam@erlang@process:subject(lustre@internals@runtime:action(PPP, server_component()))} |
{error, error()}.
do_start_actor(App, Flags) ->
On_attribute_change = gleam@option:unwrap(
erlang:element(5, App),
gleam@dict:new()
),
_pipe = (erlang:element(2, App))(Flags),
_pipe@1 = lustre@internals@runtime:start(
_pipe,
erlang:element(3, App),
erlang:element(4, App),
On_attribute_change
),
gleam@result:map_error(_pipe@1, fun(Field@0) -> {actor_error, Field@0} end).
-spec start_actor(app(PPC, any(), PPE), PPC) -> {ok,
gleam@erlang@process:subject(lustre@internals@runtime:action(PPE, server_component()))} |
{error, error()}.
start_actor(App, Flags) ->
do_start_actor(App, Flags).
-spec start_server_component(app(POS, any(), POU), POS) -> {ok,
fun((lustre@internals@runtime:action(POU, server_component())) -> nil)} |
{error, error()}.
start_server_component(App, Flags) ->
gleam@result:map(
start_actor(App, Flags),
fun(Runtime) ->
fun(_capture) -> gleam@otp@actor:send(Runtime, _capture) end
end
).
-spec register(app(nil, any(), any()), binary()) -> {ok, nil} | {error, error()}.
register(_, _) ->
{error, not_a_browser}.
-spec dispatch(PQF) -> lustre@internals@runtime:action(PQF, any()).
dispatch(Msg) ->
{dispatch, Msg}.
-spec shutdown() -> lustre@internals@runtime:action(any(), any()).
shutdown() ->
shutdown.
-spec is_browser() -> boolean().
is_browser() ->
false.
-spec start(app(PNY, any(), POA), binary(), PNY) -> {ok,
fun((lustre@internals@runtime:action(POA, client_spa())) -> nil)} |
{error, error()}.
start(App, Selector, Flags) ->
gleam@bool:guard(
not is_browser(),
{error, not_a_browser},
fun() -> do_start(App, Selector, Flags) end
).
-spec is_registered(binary()) -> boolean().
is_registered(_) ->
false.