src/lightspeed@component@nested_lifecycle.erl

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