Current section
Files
Jump to
Current section
Files
src/spectator@internal@components@processes_live.erl
-module(spectator@internal@components@processes_live).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([app/0]).
-export_type([model/0, msg/0]).
-type model() :: {model,
gleam@option:option(gleam@erlang@process:subject(msg())),
list(spectator@internal@api:process_item()),
spectator@internal@api:info_sort_criteria(),
spectator@internal@api:sort_direction(),
gleam@option:option(spectator@internal@api:process_item()),
gleam@option:option(spectator@internal@api:process_details()),
gleam@option:option(spectator@internal@api:status()),
gleam@option:option(gleam@dynamic:dynamic_())}.
-opaque msg() :: refresh |
{received_otp_details, spectator@internal@api:otp_details()} |
{created_subject, gleam@erlang@process:subject(msg())} |
{process_clicked, spectator@internal@api:process_item()} |
{heading_clicked, spectator@internal@api:info_sort_criteria()} |
{otp_state_clicked,
spectator@internal@api:process_item(),
spectator@internal@api:sys_state()}.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/processes_live.gleam", 37).
-spec emit_after(
integer(),
msg(),
gleam@option:option(gleam@erlang@process:subject(msg()))
) -> lustre@effect:effect(msg()).
emit_after(Delay, Msg, Subject) ->
case Subject of
{some, Self} ->
lustre@effect:from(
fun(_) ->
_ = gleam@erlang@process:send_after(Self, Delay, Msg),
nil
end
);
none ->
lustre@server_component:select(
fun(Dispatch, Subject@1) ->
Selector = begin
_pipe = gleam_erlang_ffi:new_selector(),
gleam@erlang@process:selecting(
_pipe,
Subject@1,
fun(Msg@1) -> Msg@1 end
)
end,
_ = gleam@erlang@process:send_after(Subject@1, Delay, Msg),
Dispatch({created_subject, Subject@1}),
Selector
end
)
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/processes_live.gleam", 61).
-spec request_otp_details(
gleam@erlang@process:pid_(),
gleam@option:option(gleam@erlang@process:subject(msg()))
) -> lustre@effect:effect(msg()).
request_otp_details(Pid, Subject) ->
case Subject of
{some, Sub} ->
lustre@effect:from(
fun(_) ->
spectator@internal@api:request_otp_data(
Pid,
fun(Details) ->
gleam@erlang@process:send(
Sub,
{received_otp_details, Details}
)
end
),
nil
end
);
none ->
lustre@effect:none()
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/processes_live.gleam", 108).
-spec do_refresh(model()) -> model().
do_refresh(Model) ->
Info = spectator@internal@api:get_info_list(),
Sorted = spectator@internal@api:sort_info_list(
Info,
erlang:element(4, Model),
erlang:element(5, Model)
),
Active_process@1 = case erlang:element(6, Model) of
none ->
none;
{some, Active_process} ->
case spectator_ffi:get_info(erlang:element(2, Active_process)) of
{ok, Info@1} ->
{some,
{process_item,
erlang:element(2, Active_process),
Info@1}};
{error, _} ->
none
end
end,
Details@1 = case Active_process@1 of
none ->
none;
{some, Ap} ->
case spectator_ffi:get_details(erlang:element(2, Ap)) of
{ok, Details} ->
{some, Details};
{error, _} ->
none
end
end,
erlang:setelement(
7,
erlang:setelement(
3,
erlang:setelement(6, Model, Active_process@1),
Sorted
),
Details@1
).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/processes_live.gleam", 135).
-spec update(model(), msg()) -> {model(), lustre@effect:effect(msg())}.
update(Model, Msg) ->
case Msg of
refresh ->
New_model = do_refresh(Model),
case erlang:element(6, New_model) of
{some, P} ->
{New_model,
request_otp_details(
erlang:element(2, P),
erlang:element(2, Model)
)};
none ->
{New_model, lustre@effect:none()}
end;
{created_subject, Subject} ->
{erlang:setelement(2, Model, {some, Subject}), lustre@effect:none()};
{process_clicked, P@1} ->
New_model@1 = begin
_pipe = erlang:setelement(
8,
erlang:setelement(
9,
erlang:setelement(6, Model, {some, P@1}),
none
),
none
),
do_refresh(_pipe)
end,
{New_model@1,
request_otp_details(
erlang:element(2, P@1),
erlang:element(2, Model)
)};
{heading_clicked, Criteria} ->
case Criteria of
C when C =:= erlang:element(4, Model) ->
New_model@2 = erlang:setelement(
5,
Model,
spectator@internal@api:invert_sort_direction(
erlang:element(5, Model)
)
),
{do_refresh(New_model@2), lustre@effect:none()};
C@1 ->
New_model@3 = erlang:setelement(4, Model, C@1),
{do_refresh(New_model@3), lustre@effect:none()}
end;
{received_otp_details, Details} ->
case erlang:element(6, Model) of
{some, P@2} when erlang:element(2, P@2) =:= erlang:element(
2,
Details
) ->
{erlang:setelement(
8,
erlang:setelement(
9,
Model,
{some, erlang:element(4, Details)}
),
{some, erlang:element(3, Details)}
),
lustre@effect:none()};
_ ->
{Model, lustre@effect:none()}
end;
{otp_state_clicked, P@3, Target_sys_state} ->
case Target_sys_state of
suspended ->
sys:resume(erlang:element(2, P@3)),
{do_refresh(Model),
request_otp_details(
erlang:element(2, P@3),
erlang:element(2, Model)
)};
running ->
sys:suspend(erlang:element(2, P@3)),
{do_refresh(Model),
request_otp_details(
erlang:element(2, P@3),
erlang:element(2, Model)
)}
end
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/processes_live.gleam", 202).
-spec view(model()) -> lustre@internals@vdom:element(msg()).
view(Model) ->
spectator@internal@views@process_table:render(
erlang:element(3, Model),
fun(Field@0) -> {process_clicked, Field@0} end,
erlang:element(6, Model),
erlang:element(7, Model),
erlang:element(8, Model),
erlang:element(9, Model),
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
fun(Field@0, Field@1) -> {otp_state_clicked, Field@0, Field@1} end
).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/processes_live.gleam", 77).
-spec init(any()) -> {model(), lustre@effect:effect(msg())}.
init(_) ->
Info = spectator@internal@api:get_info_list(),
Default_sort_criteria = reductions,
Default_sort_direction = descending,
Sorted = spectator@internal@api:sort_info_list(
Info,
Default_sort_criteria,
descending
),
{{model,
none,
Sorted,
Default_sort_criteria,
Default_sort_direction,
none,
none,
none,
none},
emit_after(500, refresh, none)}.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/processes_live.gleam", 15).
-spec app() -> lustre:app(any(), model(), msg()).
app() ->
lustre:application(fun init/1, fun update/2, fun view/1).