-module(spectator@internal@api). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([invert_sort_direction/1, sort_info_list/3, get_status/2, list_processes/0, get_info/1, get_info_list/0, get_details/1, get_all_info/1, get_state/2, request_otp_data/2, suspend/1, resume/1, format_pid/1, format_port/1, start_tag_manager/0, add_tag/2, get_tag/1]). -export_type([sys_state/0, system_primitive/0, spectator_debug_tag/0, status/0, otp_details/0, module_/0, function_/0, arity_/0, process_item/0, process_details/0, info_sort_criteria/0, sort_direction/0, info/0]). -type sys_state() :: running | suspended. -type system_primitive() :: {process, gleam@erlang@process:pid_()} | {registered_process, gleam@erlang@atom:atom_()} | {port, gleam@erlang@port:port_()} | {registered_port, gleam@erlang@atom:atom_()} | {nif_resource, gleam@dynamic:dynamic_()}. -type spectator_debug_tag() :: spectator_debug_tag. -type status() :: {status, gleam@erlang@process:pid_(), gleam@erlang@atom:atom_(), gleam@erlang@process:pid_(), sys_state(), list(gleam@dynamic:dynamic_())}. -type otp_details() :: {otp_details, gleam@erlang@process:pid_(), status(), gleam@dynamic:dynamic_()}. -type module_() :: {module, gleam@erlang@atom:atom_()}. -type function_() :: {function, gleam@erlang@atom:atom_()}. -type arity_() :: {arity, integer()}. -type process_item() :: {process_item, gleam@erlang@process:pid_(), info()}. -type process_details() :: {process_details, list(gleam@dynamic:dynamic_()), list(system_primitive()), list(system_primitive()), list(system_primitive()), boolean(), gleam@option:option(gleam@erlang@process:pid_())}. -type info_sort_criteria() :: name | tag | current_function | memory | reductions | message_queue | process_status. -type sort_direction() :: ascending | descending. -type info() :: {info, {gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_(), integer()}, {gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_(), integer()}, gleam@option:option(gleam@erlang@atom:atom_()), integer(), integer(), integer(), gleam@option:option(binary()), gleam@erlang@atom:atom_()}. -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 110). -spec function_to_string( {gleam@erlang@atom:atom_(), gleam@erlang@atom:atom_(), integer()} ) -> binary(). function_to_string(F) -> <<<<(erlang:atom_to_binary(erlang:element(1, F)))/binary, (erlang:atom_to_binary(erlang:element(2, F)))/binary>>/binary, (gleam@int:to_string(erlang:element(3, F)))/binary>>. -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 114). -spec compare_name(process_item(), process_item()) -> gleam@order:order(). compare_name(A, B) -> case {erlang:element(4, erlang:element(3, A)), erlang:element(4, erlang:element(3, B))} of {{some, A_name}, {some, B_name}} -> gleam@string:compare( erlang:atom_to_binary(A_name), erlang:atom_to_binary(B_name) ); {none, {some, _}} -> lt; {{some, _}, none} -> gt; {none, none} -> eq end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 126). -spec compare_tag(process_item(), process_item()) -> gleam@order:order(). compare_tag(A, B) -> case {erlang:element(8, erlang:element(3, A)), erlang:element(8, erlang:element(3, B))} of {{some, A_tag}, {some, B_tag}} -> gleam@string:compare(A_tag, B_tag); {none, {some, _}} -> lt; {{some, _}, none} -> gt; {none, none} -> gleam@string:compare( function_to_string(erlang:element(3, erlang:element(3, A))), function_to_string(erlang:element(3, erlang:element(3, B))) ) end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 141). -spec invert_sort_direction(sort_direction()) -> sort_direction(). invert_sort_direction(Direction) -> case Direction of ascending -> descending; descending -> ascending end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 148). -spec apply_direction(gleam@order:order(), sort_direction()) -> gleam@order:order(). apply_direction(Order, Direction) -> case Direction of ascending -> Order; descending -> gleam@order:negate(Order) end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 174). -spec sort_info_list( list(process_item()), info_sort_criteria(), sort_direction() ) -> list(process_item()). sort_info_list(Input, Criteria, Direction) -> case Criteria of memory -> gleam@list:sort( Input, fun(A, B) -> _pipe = gleam@int:compare( erlang:element(5, erlang:element(3, A)), erlang:element(5, erlang:element(3, B)) ), apply_direction(_pipe, Direction) end ); reductions -> gleam@list:sort( Input, fun(A@1, B@1) -> _pipe@1 = gleam@int:compare( erlang:element(7, erlang:element(3, A@1)), erlang:element(7, erlang:element(3, B@1)) ), apply_direction(_pipe@1, Direction) end ); message_queue -> gleam@list:sort( Input, fun(A@2, B@2) -> _pipe@2 = gleam@int:compare( erlang:element(6, erlang:element(3, A@2)), erlang:element(6, erlang:element(3, B@2)) ), apply_direction(_pipe@2, Direction) end ); current_function -> gleam@list:sort( Input, fun(A@3, B@3) -> _pipe@3 = gleam@string:compare( function_to_string( erlang:element(2, erlang:element(3, A@3)) ), function_to_string( erlang:element(2, erlang:element(3, B@3)) ) ), apply_direction(_pipe@3, Direction) end ); name -> gleam@list:sort( Input, fun(A@4, B@4) -> _pipe@4 = compare_name(A@4, B@4), apply_direction(_pipe@4, Direction) end ); tag -> gleam@list:sort( Input, fun(A@5, B@5) -> _pipe@5 = compare_tag(A@5, B@5), apply_direction(_pipe@5, Direction) end ); process_status -> gleam@list:sort( Input, fun(A@6, B@6) -> _pipe@6 = gleam@string:compare( erlang:atom_to_binary( erlang:element(9, erlang:element(3, A@6)) ), erlang:atom_to_binary( erlang:element(9, erlang:element(3, B@6)) ) ), apply_direction(_pipe@6, Direction) end ) end. -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 229). -spec get_status(gleam@erlang@process:pid_(), integer()) -> {ok, status()} | {error, gleam@dynamic:dynamic_()}. get_status(Pid, Timeout) -> spectator_ffi:get_status(Pid, Timeout). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 235). -spec list_processes() -> list(gleam@erlang@process:pid_()). list_processes() -> erlang:processes(). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 238). -spec get_info(gleam@erlang@process:pid_()) -> {ok, info()} | {error, gleam@dynamic:dynamic_()}. get_info(Pid) -> spectator_ffi:get_info(Pid). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 100). -spec get_info_list() -> list(process_item()). get_info_list() -> _pipe = erlang:processes(), gleam@list:filter_map(_pipe, fun(Pid) -> case spectator_ffi:get_info(Pid) of {error, E} -> {error, E}; {ok, Info} -> {ok, {process_item, Pid, Info}} end end). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 241). -spec get_details(gleam@erlang@process:pid_()) -> {ok, process_details()} | {error, gleam@dynamic:dynamic_()}. get_details(Pid) -> spectator_ffi:get_details(Pid). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 244). -spec get_all_info(gleam@erlang@process:pid_()) -> {ok, list(gleam@dynamic:dynamic_())} | {error, gleam@dynamic:dynamic_()}. get_all_info(Pid) -> spectator_ffi:get_all_info(Pid). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 249). -spec get_state(gleam@erlang@process:pid_(), integer()) -> {ok, gleam@dynamic:dynamic_()} | {error, gleam@dynamic:dynamic_()}. get_state(Pid, Timeout) -> spectator_ffi:get_state(Pid, Timeout). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 155). -spec request_otp_data(gleam@erlang@process:pid_(), fun((otp_details()) -> nil)) -> gleam@erlang@process:pid_(). request_otp_data(P, Callback) -> gleam@erlang@process:start(fun() -> case spectator_ffi:get_status(P, 100) of {error, _} -> nil; {ok, Status} -> State = begin _pipe = spectator_ffi:get_state(P, 100), gleam@result:unwrap(_pipe, gleam_stdlib:identity(none)) end, Callback({otp_details, P, Status, State}) end end, false). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 255). -spec suspend(gleam@erlang@process:pid_()) -> nil. suspend(Pid) -> sys:suspend(Pid). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 258). -spec resume(gleam@erlang@process:pid_()) -> nil. resume(Pid) -> sys:resume(Pid). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 261). -spec format_pid(gleam@erlang@process:pid_()) -> binary(). format_pid(Pid) -> spectator_ffi:format_pid(Pid). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 264). -spec format_port(gleam@erlang@port:port_()) -> binary(). format_port(Port) -> spectator_ffi:format_port(Port). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 267). -spec start_tag_manager() -> {ok, gleam@erlang@process:pid_()} | {error, gleam@dynamic:dynamic_()}. start_tag_manager() -> spectator_tag_manager:start_link(). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 270). -spec add_tag(gleam@erlang@process:pid_(), binary()) -> nil. add_tag(Pid, Tag) -> spectator_tag_manager:add_tag(Pid, Tag). -file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 273). -spec get_tag(gleam@erlang@process:pid_()) -> gleam@option:option(binary()). get_tag(Pid) -> spectator_tag_manager:get_tag(Pid).