-module(lustre). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([application/3, element/1, simple/3, component/5, start/3, destroy/1, is_browser/0, is_registered/1]). -export_type([app/3, error/0]). -opaque app(GIH, GII, GIJ) :: app | {gleam_phantom, GIH, GII, GIJ}. -type error() :: app_already_started | app_not_yet_started | bad_component_name | component_already_registered | element_not_found | not_a_browser. -spec application( fun((GIW) -> {GIX, lustre@effect:effect(GIY)}), fun((GIX, GIY) -> {GIX, lustre@effect:effect(GIY)}), fun((GIX) -> lustre@element:element(GIY)) ) -> app(GIW, GIX, GIY). application(_, _, _) -> gleam@dynamic:unsafe_coerce(gleam@dynamic:from(nil)). -spec element(lustre@element:element(GIK)) -> app(nil, nil, GIK). element(Element) -> Init = fun(_) -> {nil, lustre@effect:none()} end, Update = fun(_, _) -> {nil, lustre@effect:none()} end, View = fun(_) -> Element end, application(Init, Update, View). -spec simple( fun((GIP) -> GIQ), fun((GIQ, GIR) -> GIQ), fun((GIQ) -> lustre@element:element(GIR)) ) -> app(GIP, GIQ, GIR). 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( binary(), fun(() -> {GJF, lustre@effect:effect(GJG)}), fun((GJF, GJG) -> {GJF, lustre@effect:effect(GJG)}), fun((GJF) -> lustre@element:element(GJG)), gleam@dict:dict(binary(), fun((gleam@dynamic:dynamic_()) -> {ok, GJG} | {error, list(gleam@dynamic:decode_error())})) ) -> {ok, nil} | {error, error()}. component(_, _, _, _, _) -> {ok, nil}. -spec start(app(GJP, any(), GJR), binary(), GJP) -> {ok, fun((GJR) -> nil)} | {error, error()}. start(_, _, _) -> {error, not_a_browser}. -spec destroy(app(any(), any(), any())) -> {ok, nil} | {error, error()}. destroy(_) -> {ok, nil}. -spec is_browser() -> boolean(). is_browser() -> false. -spec is_registered(binary()) -> boolean(). is_registered(_) -> false.