-module(lightspeed@component@nested_lifecycle).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/lightspeed/component/nested_lifecycle.gleam").
-export([start/2, scoped_event/3, child_target/2, child/2, mount_child/4, update_child/3, suspend_child/2, resume_child/2, fail_child/3, terminate_child/2, route_event/2, parent_id/1, route/1, parent_target/1, parent_mount_count/1, children/1, patches/1, lifecycle_events/1, routed_events/1, authority_violations/1, child_lifecycle_label/1, route_decision_label/1, child_signature/1, runtime_signature/1, stable_child_identity/1, authority_invariants/1, subtree_isolated/2]).
-export_type([child_lifecycle/0, event_scope/0, scoped_event/0, route_decision/0, child_node/0, runtime/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" First-class nested LiveView lifecycle primitives for M55.\n").
-type child_lifecycle() :: mounted | suspended | {failed, binary()} | terminated.
-type event_scope() :: parent_scope | {child_scope, binary()}.
-type scoped_event() :: {scoped_event, event_scope(), binary(), binary()}.
-type route_decision() :: routed_to_parent |
{routed_to_child, binary()} |
{rejected, binary()}.
-type child_node() :: {child_node,
binary(),
binary(),
child_lifecycle(),
integer(),
integer(),
binary()}.
-opaque runtime() :: {runtime,
binary(),
binary(),
binary(),
integer(),
list(child_node()),
list(lightspeed@diff:patch()),
list(binary()),
list(binary()),
list(binary())}.
-file("src/lightspeed/component/nested_lifecycle.gleam", 62).
?DOC(" Start one parent runtime.\n").
-spec start(binary(), binary()) -> {runtime(), list(lightspeed@diff:patch())}.
start(Parent_id, Route) ->
Target = <<"#parent-"/utf8, Parent_id/binary>>,
Patch = {replace,
Target,
<<<<"<main data-parent=\""/utf8, Parent_id/binary>>/binary,
"\"></main>"/utf8>>},
Runtime = {runtime,
Parent_id,
Route,
Target,
1,
[],
[Patch],
[<<"parent_mounted:"/utf8, Route/binary>>],
[],
[]},
{Runtime, [Patch]}.
-file("src/lightspeed/component/nested_lifecycle.gleam", 86).
?DOC(" Build one scoped event.\n").
-spec scoped_event(event_scope(), binary(), binary()) -> scoped_event().
scoped_event(Scope, Name, Payload) ->
{scoped_event, Scope, Name, Payload}.
-file("src/lightspeed/component/nested_lifecycle.gleam", 708).
-spec append_ordered_to_rev(list(HNB), list(HNB)) -> list(HNB).
append_ordered_to_rev(Rev, Ordered) ->
case Ordered of
[] ->
Rev;
[Value | Rest] ->
append_ordered_to_rev([Value | Rev], Rest)
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 502).
?DOC(" Child patch target.\n").
-spec child_target(runtime(), binary()) -> binary().
child_target(Runtime, Child_id) ->
<<<<(erlang:element(4, Runtime))/binary, "/child-"/utf8>>/binary,
Child_id/binary>>.
-file("src/lightspeed/component/nested_lifecycle.gleam", 635).
-spec child_identity(binary(), binary()) -> binary().
child_identity(Parent_id, Child_id) ->
<<<<Parent_id/binary, "::"/utf8>>/binary, Child_id/binary>>.
-file("src/lightspeed/component/nested_lifecycle.gleam", 653).
-spec replace_child(list(child_node()), binary(), child_node()) -> list(child_node()).
replace_child(Children_rev, Child_id, Replacement) ->
case Children_rev of
[] ->
[];
[Child | Rest] ->
case erlang:element(2, Child) =:= Child_id of
true ->
[Replacement | Rest];
false ->
[Child | replace_child(Rest, Child_id, Replacement)]
end
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 639).
-spec find_child(list(child_node()), binary()) -> gleam@option:option(child_node()).
find_child(Children_rev, Child_id) ->
case Children_rev of
[] ->
none;
[Child | Rest] ->
case erlang:element(2, Child) =:= Child_id of
true ->
{some, Child};
false ->
find_child(Rest, Child_id)
end
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 517).
?DOC(" One child by id.\n").
-spec child(runtime(), binary()) -> gleam@option:option(child_node()).
child(Runtime, Child_id) ->
find_child(erlang:element(6, Runtime), Child_id).
-file("src/lightspeed/component/nested_lifecycle.gleam", 95).
?DOC(" Mount a child boundary with stable identity.\n").
-spec mount_child(runtime(), binary(), binary(), binary()) -> {runtime(),
list(lightspeed@diff:patch())}.
mount_child(Runtime, Child_id, Fingerprint, Html) ->
case child(Runtime, Child_id) of
{some, Existing} ->
case erlang:element(4, Existing) of
terminated ->
Remounted = {child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
mounted,
erlang:element(5, Existing) + 1,
erlang:element(6, Existing),
Fingerprint},
Patch = {replace, child_target(Runtime, Child_id), Html},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
Remounted
),
append_ordered_to_rev(
erlang:element(7, Runtime),
[Patch]
),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_remounted:"/utf8, Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch]};
mounted ->
Resumed = {child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
mounted,
erlang:element(5, Existing),
erlang:element(6, Existing),
Fingerprint},
Patch@1 = {update_segments,
child_target(Runtime, Child_id),
Fingerprint,
[lightspeed@diff:slot(<<"html"/utf8>>, Html)]},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
Resumed
),
append_ordered_to_rev(
erlang:element(7, Runtime),
[Patch@1]
),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_mounted_existing:"/utf8,
Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch@1]};
suspended ->
Resumed = {child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
mounted,
erlang:element(5, Existing),
erlang:element(6, Existing),
Fingerprint},
Patch@1 = {update_segments,
child_target(Runtime, Child_id),
Fingerprint,
[lightspeed@diff:slot(<<"html"/utf8>>, Html)]},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
Resumed
),
append_ordered_to_rev(
erlang:element(7, Runtime),
[Patch@1]
),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_mounted_existing:"/utf8,
Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch@1]};
{failed, _} ->
Resumed = {child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
mounted,
erlang:element(5, Existing),
erlang:element(6, Existing),
Fingerprint},
Patch@1 = {update_segments,
child_target(Runtime, Child_id),
Fingerprint,
[lightspeed@diff:slot(<<"html"/utf8>>, Html)]},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
Resumed
),
append_ordered_to_rev(
erlang:element(7, Runtime),
[Patch@1]
),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_mounted_existing:"/utf8,
Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch@1]}
end;
none ->
Created = {child_node,
Child_id,
child_identity(erlang:element(2, Runtime), Child_id),
mounted,
1,
0,
Fingerprint},
Patch@2 = {replace, child_target(Runtime, Child_id), Html},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
[Created | erlang:element(6, Runtime)],
append_ordered_to_rev(erlang:element(7, Runtime), [Patch@2]),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_mounted:"/utf8, Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch@2]}
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 198).
?DOC(" Update one mounted child without remounting the parent.\n").
-spec update_child(runtime(), binary(), binary()) -> {runtime(),
list(lightspeed@diff:patch())}.
update_child(Runtime, Child_id, Html) ->
case child(Runtime, Child_id) of
{some, Existing} ->
case erlang:element(4, Existing) of
mounted ->
Updated = {child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
erlang:element(4, Existing),
erlang:element(5, Existing),
erlang:element(6, Existing) + 1,
erlang:element(7, Existing)},
Patch = {update_segments,
child_target(Runtime, Child_id),
erlang:element(7, Updated),
[lightspeed@diff:slot(<<"html"/utf8>>, Html)]},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
Updated
),
append_ordered_to_rev(
erlang:element(7, Runtime),
[Patch]
),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_updated:"/utf8, Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch]};
suspended ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
erlang:element(9, Runtime),
append_ordered_to_rev(
erlang:element(10, Runtime),
[<<"update_blocked:suspended:"/utf8,
Child_id/binary>>]
)},
[]};
{failed, Reason} ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
erlang:element(9, Runtime),
append_ordered_to_rev(
erlang:element(10, Runtime),
[<<<<<<"update_blocked:failed:"/utf8,
Child_id/binary>>/binary,
":"/utf8>>/binary,
Reason/binary>>]
)},
[]};
terminated ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
erlang:element(9, Runtime),
append_ordered_to_rev(
erlang:element(10, Runtime),
[<<"update_blocked:terminated:"/utf8,
Child_id/binary>>]
)},
[]}
end;
none ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
erlang:element(9, Runtime),
append_ordered_to_rev(
erlang:element(10, Runtime),
[<<"update_blocked:unknown_child:"/utf8,
Child_id/binary>>]
)},
[]}
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 284).
?DOC(" Suspend one child subtree.\n").
-spec suspend_child(runtime(), binary()) -> runtime().
suspend_child(Runtime, Child_id) ->
case child(Runtime, Child_id) of
{some, Existing} ->
{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
{child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
suspended,
erlang:element(5, Existing),
erlang:element(6, Existing),
erlang:element(7, Existing)}
),
erlang:element(7, Runtime),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_suspended:"/utf8, Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)};
none ->
Runtime
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 306).
?DOC(" Resume one suspended child subtree.\n").
-spec resume_child(runtime(), binary()) -> runtime().
resume_child(Runtime, Child_id) ->
case child(Runtime, Child_id) of
{some, Existing} ->
case erlang:element(4, Existing) of
suspended ->
{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
{child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
mounted,
erlang:element(5, Existing),
erlang:element(6, Existing),
erlang:element(7, Existing)}
),
erlang:element(7, Runtime),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_resumed:"/utf8, Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)};
_ ->
Runtime
end;
none ->
Runtime
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 333).
?DOC(" Fail one child subtree while keeping siblings alive.\n").
-spec fail_child(runtime(), binary(), binary()) -> {runtime(),
list(lightspeed@diff:patch())}.
fail_child(Runtime, Child_id, Reason) ->
case child(Runtime, Child_id) of
{some, Existing} ->
Failed = {child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
{failed, Reason},
erlang:element(5, Existing),
erlang:element(6, Existing),
erlang:element(7, Existing)},
Patch = {replace,
child_target(Runtime, Child_id),
<<<<<<<<"<section data-child=\""/utf8, Child_id/binary>>/binary,
"\" data-state=\"failed\">"/utf8>>/binary,
Reason/binary>>/binary,
"</section>"/utf8>>},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(erlang:element(6, Runtime), Child_id, Failed),
append_ordered_to_rev(erlang:element(7, Runtime), [Patch]),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<<<<<"child_failed:"/utf8, Child_id/binary>>/binary,
":"/utf8>>/binary,
Reason/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch]};
none ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
erlang:element(9, Runtime),
append_ordered_to_rev(
erlang:element(10, Runtime),
[<<"fail_blocked:unknown_child:"/utf8, Child_id/binary>>]
)},
[]}
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 381).
?DOC(" Terminate one child subtree.\n").
-spec terminate_child(runtime(), binary()) -> {runtime(),
list(lightspeed@diff:patch())}.
terminate_child(Runtime, Child_id) ->
case child(Runtime, Child_id) of
{some, Existing} ->
case erlang:element(4, Existing) of
terminated ->
{Runtime, []};
_ ->
Terminated = {child_node,
erlang:element(2, Existing),
erlang:element(3, Existing),
terminated,
erlang:element(5, Existing),
erlang:element(6, Existing),
erlang:element(7, Existing)},
Patch = {remove, child_target(Runtime, Child_id)},
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
replace_child(
erlang:element(6, Runtime),
Child_id,
Terminated
),
append_ordered_to_rev(
erlang:element(7, Runtime),
[Patch]
),
append_ordered_to_rev(
erlang:element(8, Runtime),
[<<"child_terminated:"/utf8, Child_id/binary>>]
),
erlang:element(9, Runtime),
erlang:element(10, Runtime)},
[Patch]}
end;
none ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
erlang:element(9, Runtime),
append_ordered_to_rev(
erlang:element(10, Runtime),
[<<"terminate_blocked:unknown_child:"/utf8,
Child_id/binary>>]
)},
[]}
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 619).
-spec route_rejected(runtime(), binary(), binary()) -> {runtime(),
route_decision()}.
route_rejected(Runtime, Reason, Name) ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
append_ordered_to_rev(
erlang:element(9, Runtime),
[<<<<<<"rejected:"/utf8, Reason/binary>>/binary, ":"/utf8>>/binary,
Name/binary>>]
),
erlang:element(10, Runtime)},
{rejected, Reason}}.
-file("src/lightspeed/component/nested_lifecycle.gleam", 429).
?DOC(" Route one scoped event.\n").
-spec route_event(runtime(), scoped_event()) -> {runtime(), route_decision()}.
route_event(Runtime, Scoped) ->
case erlang:element(2, Scoped) of
parent_scope ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
append_ordered_to_rev(
erlang:element(9, Runtime),
[<<"routed:parent:"/utf8,
(erlang:element(3, Scoped))/binary>>]
),
erlang:element(10, Runtime)},
routed_to_parent};
{child_scope, Child_id} ->
case child(Runtime, Child_id) of
none ->
route_rejected(
Runtime,
<<"unknown_child:"/utf8, Child_id/binary>>,
erlang:element(3, Scoped)
);
{some, Existing} ->
case erlang:element(4, Existing) of
mounted ->
{{runtime,
erlang:element(2, Runtime),
erlang:element(3, Runtime),
erlang:element(4, Runtime),
erlang:element(5, Runtime),
erlang:element(6, Runtime),
erlang:element(7, Runtime),
erlang:element(8, Runtime),
append_ordered_to_rev(
erlang:element(9, Runtime),
[<<<<<<"routed:child:"/utf8,
Child_id/binary>>/binary,
":"/utf8>>/binary,
(erlang:element(3, Scoped))/binary>>]
),
erlang:element(10, Runtime)},
{routed_to_child, Child_id}};
suspended ->
route_rejected(
Runtime,
<<"child_suspended:"/utf8, Child_id/binary>>,
erlang:element(3, Scoped)
);
{failed, Reason} ->
route_rejected(
Runtime,
<<<<<<"child_failed:"/utf8, Child_id/binary>>/binary,
":"/utf8>>/binary,
Reason/binary>>,
erlang:element(3, Scoped)
);
terminated ->
route_rejected(
Runtime,
<<"child_terminated:"/utf8, Child_id/binary>>,
erlang:element(3, Scoped)
)
end
end
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 487).
?DOC(" Parent id.\n").
-spec parent_id(runtime()) -> binary().
parent_id(Runtime) ->
erlang:element(2, Runtime).
-file("src/lightspeed/component/nested_lifecycle.gleam", 492).
?DOC(" Parent route.\n").
-spec route(runtime()) -> binary().
route(Runtime) ->
erlang:element(3, Runtime).
-file("src/lightspeed/component/nested_lifecycle.gleam", 497).
?DOC(" Parent patch target.\n").
-spec parent_target(runtime()) -> binary().
parent_target(Runtime) ->
erlang:element(4, Runtime).
-file("src/lightspeed/component/nested_lifecycle.gleam", 507).
?DOC(" Parent mount count.\n").
-spec parent_mount_count(runtime()) -> integer().
parent_mount_count(Runtime) ->
erlang:element(5, Runtime).
-file("src/lightspeed/component/nested_lifecycle.gleam", 512).
?DOC(" Children in insertion order.\n").
-spec children(runtime()) -> list(child_node()).
children(Runtime) ->
lists:reverse(erlang:element(6, Runtime)).
-file("src/lightspeed/component/nested_lifecycle.gleam", 522).
?DOC(" All emitted patches in execution order.\n").
-spec patches(runtime()) -> list(lightspeed@diff:patch()).
patches(Runtime) ->
lists:reverse(erlang:element(7, Runtime)).
-file("src/lightspeed/component/nested_lifecycle.gleam", 527).
?DOC(" Lifecycle events in execution order.\n").
-spec lifecycle_events(runtime()) -> list(binary()).
lifecycle_events(Runtime) ->
lists:reverse(erlang:element(8, Runtime)).
-file("src/lightspeed/component/nested_lifecycle.gleam", 532).
?DOC(" Routed event labels in execution order.\n").
-spec routed_events(runtime()) -> list(binary()).
routed_events(Runtime) ->
lists:reverse(erlang:element(9, Runtime)).
-file("src/lightspeed/component/nested_lifecycle.gleam", 537).
?DOC(" Authority violation labels in execution order.\n").
-spec authority_violations(runtime()) -> list(binary()).
authority_violations(Runtime) ->
lists:reverse(erlang:element(10, Runtime)).
-file("src/lightspeed/component/nested_lifecycle.gleam", 542).
?DOC(" Child lifecycle label.\n").
-spec child_lifecycle_label(child_lifecycle()) -> binary().
child_lifecycle_label(Lifecycle) ->
case Lifecycle of
mounted ->
<<"mounted"/utf8>>;
suspended ->
<<"suspended"/utf8>>;
{failed, Reason} ->
<<"failed:"/utf8, Reason/binary>>;
terminated ->
<<"terminated"/utf8>>
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 552).
?DOC(" Routing decision label.\n").
-spec route_decision_label(route_decision()) -> binary().
route_decision_label(Decision) ->
case Decision of
routed_to_parent ->
<<"routed_to_parent"/utf8>>;
{routed_to_child, Child_id} ->
<<"routed_to_child:"/utf8, Child_id/binary>>;
{rejected, Reason} ->
<<"rejected:"/utf8, Reason/binary>>
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 736).
-spec int_to_string(integer()) -> binary().
int_to_string(Value) ->
erlang:integer_to_binary(Value).
-file("src/lightspeed/component/nested_lifecycle.gleam", 561).
?DOC(" Child signature.\n").
-spec child_signature(child_node()) -> binary().
child_signature(Child) ->
<<<<<<<<<<<<<<<<<<<<(erlang:element(2, Child))/binary, ":"/utf8>>/binary,
(erlang:element(3, Child))/binary>>/binary,
":"/utf8>>/binary,
(child_lifecycle_label(erlang:element(4, Child)))/binary>>/binary,
":mount="/utf8>>/binary,
(int_to_string(erlang:element(5, Child)))/binary>>/binary,
":update="/utf8>>/binary,
(int_to_string(erlang:element(6, Child)))/binary>>/binary,
":fp="/utf8>>/binary,
(erlang:element(7, Child))/binary>>.
-file("src/lightspeed/component/nested_lifecycle.gleam", 726).
-spec join_with(binary(), list(binary())) -> binary().
join_with(Separator, Values) ->
case Values of
[] ->
<<""/utf8>>;
[First | Rest] ->
gleam@list:fold(
Rest,
First,
fun(Accumulator, Value) ->
<<<<Accumulator/binary, Separator/binary>>/binary,
Value/binary>>
end
)
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 576).
?DOC(" Runtime signature.\n").
-spec runtime_signature(runtime()) -> binary().
runtime_signature(Runtime) ->
<<<<<<<<<<<<<<<<<<<<<<<<<<"parent="/utf8,
(erlang:element(
2,
Runtime
))/binary>>/binary,
":route="/utf8>>/binary,
(erlang:element(3, Runtime))/binary>>/binary,
":mounts="/utf8>>/binary,
(int_to_string(
erlang:element(5, Runtime)
))/binary>>/binary,
"|children="/utf8>>/binary,
(join_with(
<<","/utf8>>,
gleam@list:map(
children(Runtime),
fun child_signature/1
)
))/binary>>/binary,
"|lifecycle="/utf8>>/binary,
(join_with(<<","/utf8>>, lifecycle_events(Runtime)))/binary>>/binary,
"|routed="/utf8>>/binary,
(join_with(<<","/utf8>>, routed_events(Runtime)))/binary>>/binary,
"|violations="/utf8>>/binary,
(join_with(<<","/utf8>>, authority_violations(Runtime)))/binary>>.
-file("src/lightspeed/component/nested_lifecycle.gleam", 715).
-spec contains(list(binary()), binary()) -> boolean().
contains(Items, Value) ->
case Items of
[] ->
false;
[Item | Rest] ->
case Item =:= Value of
true ->
true;
false ->
contains(Rest, Value)
end
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 697).
-spec identities_unique(list(child_node()), list(binary())) -> boolean().
identities_unique(Nodes, Seen) ->
case Nodes of
[] ->
true;
[Node | Rest] ->
case contains(Seen, erlang:element(3, Node)) of
true ->
false;
false ->
identities_unique(Rest, [erlang:element(3, Node) | Seen])
end
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 686).
-spec identities_stable(list(child_node()), binary()) -> boolean().
identities_stable(Nodes, Parent_id) ->
case Nodes of
[] ->
true;
[Node | Rest] ->
(((erlang:element(3, Node) =:= child_identity(
Parent_id,
erlang:element(2, Node)
))
andalso (erlang:element(5, Node) >= 1))
andalso (erlang:element(6, Node) >= 0))
andalso identities_stable(Rest, Parent_id)
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 594).
?DOC(" True when child identity contracts are stable and unique.\n").
-spec stable_child_identity(runtime()) -> boolean().
stable_child_identity(Runtime) ->
Nodes = children(Runtime),
identities_stable(Nodes, erlang:element(2, Runtime)) andalso identities_unique(
Nodes,
[]
).
-file("src/lightspeed/component/nested_lifecycle.gleam", 600).
?DOC(" True when no authority invariants were violated.\n").
-spec authority_invariants(runtime()) -> boolean().
authority_invariants(Runtime) ->
erlang:element(10, Runtime) =:= [].
-file("src/lightspeed/component/nested_lifecycle.gleam", 668).
-spec siblings_not_failed(list(child_node()), binary()) -> boolean().
siblings_not_failed(Nodes, Failed_child_id) ->
case Nodes of
[] ->
true;
[Node | Rest] ->
case erlang:element(2, Node) =:= Failed_child_id of
true ->
siblings_not_failed(Rest, Failed_child_id);
false ->
case erlang:element(4, Node) of
{failed, _} ->
false;
_ ->
siblings_not_failed(Rest, Failed_child_id)
end
end
end.
-file("src/lightspeed/component/nested_lifecycle.gleam", 605).
?DOC(" True when one failed subtree does not corrupt siblings or parent mounts.\n").
-spec subtree_isolated(runtime(), binary()) -> boolean().
subtree_isolated(Runtime, Failed_child_id) ->
case child(Runtime, Failed_child_id) of
{some, Failed_child} ->
case erlang:element(4, Failed_child) of
{failed, _} ->
(erlang:element(5, Runtime) =:= 1) andalso siblings_not_failed(
children(Runtime),
Failed_child_id
);
_ ->
false
end;
none ->
false
end.