Current section
Files
Jump to
Current section
Files
src/spectator@internal@api.erl
-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, sort_table_list/3, suspend/1, resume/1, ets_insert/2, 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, format_pid/1, format_port/1, list_ets_tables/0, get_ets_table_info/1, new_ets_table/1, get_raw_ets_data/1, opaque_tuple_to_list/1, get_ets_data/1, get_word_size/0, compare_dynamic_data/2, sort_table_data/3, start_tag_manager/0, add_tag/2, get_tag/1]).
-export_type([opaque_tuple/0, sys_state/0, table/0, table_data/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, table_sort_criteria/0, sort_direction/0, info/0]).
-type opaque_tuple() :: any().
-type sys_state() :: running | suspended.
-type table() :: {table,
gleam@erlang:reference_(),
gleam@erlang@atom:atom_(),
gleam@erlang@atom:atom_(),
integer(),
integer(),
gleam@erlang@process:pid_(),
gleam@erlang@atom:atom_(),
boolean(),
boolean()}.
-type table_data() :: {table_data,
list(list(gleam@dynamic:dynamic_())),
integer()}.
-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 table_sort_criteria() :: table_id |
table_name |
table_type |
size |
table_memory |
owner |
protection |
read_concurrency |
write_concurrency.
-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", 145).
-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", 149).
-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", 161).
-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", 176).
-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", 183).
-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", 209).
-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", 263).
-spec disgustingly_index_into_list_at(list(APHE), integer()) -> {ok, APHE} |
{error, nil}.
disgustingly_index_into_list_at(List, Index) ->
case Index >= 0 of
true ->
_pipe = List,
_pipe@1 = gleam@list:drop(_pipe, Index),
gleam@list:first(_pipe@1);
false ->
{error, nil}
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 302).
-spec sort_table_list(list(table()), table_sort_criteria(), sort_direction()) -> list(table()).
sort_table_list(Input, Criteria, Direction) ->
case Criteria of
table_id ->
gleam@list:sort(
Input,
fun(A, B) ->
_pipe = gleam@string:compare(
gleam@string:inspect(erlang:element(2, A)),
gleam@string:inspect(erlang:element(2, B))
),
apply_direction(_pipe, Direction)
end
);
table_name ->
gleam@list:sort(
Input,
fun(A@1, B@1) ->
_pipe@1 = gleam@string:compare(
erlang:atom_to_binary(erlang:element(3, A@1)),
erlang:atom_to_binary(erlang:element(3, B@1))
),
apply_direction(_pipe@1, Direction)
end
);
table_type ->
gleam@list:sort(
Input,
fun(A@2, B@2) ->
_pipe@2 = gleam@string:compare(
erlang:atom_to_binary(erlang:element(4, A@2)),
erlang:atom_to_binary(erlang:element(4, B@2))
),
apply_direction(_pipe@2, Direction)
end
);
size ->
gleam@list:sort(
Input,
fun(A@3, B@3) ->
_pipe@3 = gleam@int:compare(
erlang:element(5, A@3),
erlang:element(5, B@3)
),
apply_direction(_pipe@3, Direction)
end
);
table_memory ->
gleam@list:sort(
Input,
fun(A@4, B@4) ->
_pipe@4 = gleam@int:compare(
erlang:element(6, A@4),
erlang:element(6, B@4)
),
apply_direction(_pipe@4, Direction)
end
);
owner ->
gleam@list:sort(
Input,
fun(A@5, B@5) ->
_pipe@5 = gleam@string:compare(
gleam@string:inspect(erlang:element(7, A@5)),
gleam@string:inspect(erlang:element(7, B@5))
),
apply_direction(_pipe@5, Direction)
end
);
protection ->
gleam@list:sort(
Input,
fun(A@6, B@6) ->
_pipe@6 = gleam@string:compare(
erlang:atom_to_binary(erlang:element(8, A@6)),
erlang:atom_to_binary(erlang:element(8, B@6))
),
apply_direction(_pipe@6, Direction)
end
);
read_concurrency ->
gleam@list:sort(
Input,
fun(A@7, B@7) ->
_pipe@7 = gleam@bool:compare(
erlang:element(9, A@7),
erlang:element(9, B@7)
),
apply_direction(_pipe@7, Direction)
end
);
write_concurrency ->
gleam@list:sort(
Input,
fun(A@8, B@8) ->
_pipe@8 = gleam@bool:compare(
erlang:element(10, A@8),
erlang:element(10, B@8)
),
apply_direction(_pipe@8, Direction)
end
)
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 400).
-spec suspend(gleam@erlang@process:pid_()) -> nil.
suspend(Pid) ->
sys:suspend(Pid).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 403).
-spec resume(gleam@erlang@process:pid_()) -> nil.
resume(Pid) ->
sys:resume(Pid).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 406).
-spec ets_insert(gleam@erlang@atom:atom_(), list({any(), any()})) -> nil.
ets_insert(Table, Tuple) ->
ets:insert(Table, Tuple).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 411).
-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", 417).
-spec list_processes() -> list(gleam@erlang@process:pid_()).
list_processes() ->
erlang:processes().
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 420).
-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", 135).
-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", 423).
-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", 426).
-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", 431).
-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", 190).
-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", 437).
-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", 440).
-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", 443).
-spec list_ets_tables() -> {ok, list(table())} | {error, nil}.
list_ets_tables() ->
spectator_ffi:list_ets_tables().
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 446).
-spec get_ets_table_info(gleam@erlang@atom:atom_()) -> {ok, table()} |
{error, nil}.
get_ets_table_info(Name) ->
spectator_ffi:get_ets_table_info(Name).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 449).
-spec new_ets_table(gleam@erlang@atom:atom_()) -> {ok,
gleam@erlang@atom:atom_()} |
{error, nil}.
new_ets_table(Name) ->
spectator_ffi:new_ets_table(Name).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 452).
-spec get_raw_ets_data(gleam@erlang:reference_()) -> {ok,
list(list(opaque_tuple()))} |
{error, nil}.
get_raw_ets_data(Table) ->
spectator_ffi:get_ets_data(Table).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 457).
-spec opaque_tuple_to_list(opaque_tuple()) -> list(gleam@dynamic:dynamic_()).
opaque_tuple_to_list(Tuple) ->
spectator_ffi:opaque_tuple_to_list(Tuple).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 374).
-spec process_raw_ets_data(
list(list(opaque_tuple())),
list(list(gleam@dynamic:dynamic_())),
integer()
) -> {ok, table_data()} | {error, nil}.
process_raw_ets_data(Remainder, Accumulator, Max_length) ->
case Remainder of
[] ->
{ok, {table_data, Accumulator, Max_length}};
[[Tup] | Rest] ->
Converted = spectator_ffi:opaque_tuple_to_list(Tup),
process_raw_ets_data(
Rest,
[Converted | Accumulator],
gleam@int:max(Max_length, erlang:length(Converted))
);
_ ->
{error, nil}
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 369).
-spec get_ets_data(table()) -> {ok, table_data()} | {error, nil}.
get_ets_data(Table) ->
gleam@result:'try'(
spectator_ffi:get_ets_data(erlang:element(2, Table)),
fun(Raw_data) -> process_raw_ets_data(Raw_data, [], 0) end
).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 460).
-spec get_word_size() -> integer().
get_word_size() ->
spectator_ffi:get_word_size().
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 463).
-spec compare_dynamic_data(gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_()) -> gleam@order:order().
compare_dynamic_data(A, B) ->
spectator_ffi:compare_data(A, B).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 276).
-spec sort_table_data(table_data(), integer(), sort_direction()) -> table_data().
sort_table_data(Input, Sort_column, Sort_direction) ->
Sorted = gleam@list:sort(
erlang:element(2, Input),
fun(A, B) ->
A_cell = disgustingly_index_into_list_at(A, Sort_column),
B_cell = disgustingly_index_into_list_at(B, Sort_column),
case {A_cell, B_cell} of
{{ok, A@1}, {ok, B@1}} ->
_pipe = spectator_ffi:compare_data(A@1, B@1),
apply_direction(_pipe, Sort_direction);
{{ok, _}, {error, _}} ->
_pipe@1 = gt,
apply_direction(_pipe@1, Sort_direction);
{{error, _}, {ok, _}} ->
lt;
{{error, _}, {error, _}} ->
_pipe@2 = eq,
apply_direction(_pipe@2, Sort_direction)
end
end
),
erlang:setelement(2, Input, Sorted).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/api.gleam", 471).
-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", 474).
-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", 477).
-spec get_tag(gleam@erlang@process:pid_()) -> gleam@option:option(binary()).
get_tag(Pid) ->
spectator_tag_manager:get_tag(Pid).