Current section

Files

Jump to
spectator src spectator@internal@components@ets_overview_live.erl
Raw

src/spectator@internal@components@ets_overview_live.erl

-module(spectator@internal@components@ets_overview_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:table()),
spectator@internal@api:table_sort_criteria(),
spectator@internal@api:sort_direction()}.
-opaque msg() :: refresh |
{heading_clicked, spectator@internal@api:table_sort_criteria()} |
{created_subject, gleam@erlang@process:subject(msg())}.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_overview_live.gleam", 36).
-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/ets_overview_live.gleam", 81).
-spec get_sorted_tables(
spectator@internal@api:table_sort_criteria(),
spectator@internal@api:sort_direction()
) -> list(spectator@internal@api:table()).
get_sorted_tables(Sort_criteria, Sort_direction) ->
_pipe = gleam@result:unwrap(spectator_ffi:list_ets_tables(), []),
spectator@internal@api:sort_table_list(_pipe, Sort_criteria, Sort_direction).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_overview_live.gleam", 58).
-spec init(any()) -> {model(), lustre@effect:effect(msg())}.
init(_) ->
Defaul_sort_criteria = sort_by_table_size,
Defaul_sort_direction = descending,
{{model,
none,
get_sorted_tables(Defaul_sort_criteria, Defaul_sort_direction),
Defaul_sort_criteria,
Defaul_sort_direction},
emit_after(500, refresh, none)}.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_overview_live.gleam", 86).
-spec update(model(), msg()) -> {model(), lustre@effect:effect(msg())}.
update(Model, Msg) ->
case Msg of
refresh ->
{erlang:setelement(
3,
Model,
get_sorted_tables(
erlang:element(4, Model),
erlang:element(5, Model)
)
),
emit_after(500, refresh, erlang:element(2, Model))};
{created_subject, Subject} ->
{erlang:setelement(2, Model, {some, Subject}), lustre@effect:none()};
{heading_clicked, Criteria} ->
case Criteria of
C when C =:= erlang:element(4, Model) ->
New_direction = spectator@internal@api:invert_sort_direction(
erlang:element(5, Model)
),
New_model = erlang:setelement(
5,
erlang:setelement(
3,
Model,
get_sorted_tables(C, New_direction)
),
New_direction
),
{New_model, lustre@effect:none()};
C@1 ->
New_model@1 = erlang:setelement(
4,
erlang:setelement(
3,
Model,
get_sorted_tables(C@1, erlang:element(5, Model))
),
C@1
),
{New_model@1, lustre@effect:none()}
end
end.
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_overview_live.gleam", 251).
-spec link_cell(
spectator@internal@api:table(),
list(lustre@internals@vdom:element(msg()))
) -> list(lustre@internals@vdom:element(msg())).
link_cell(T, Children) ->
[lustre@element@html:a(
[lustre@attribute:href(
<<"/ets/"/utf8,
(gleam@uri:percent_encode(
erlang:atom_to_binary(erlang:element(3, T))
))/binary>>
)],
Children
)].
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_overview_live.gleam", 127).
-spec view(model()) -> lustre@internals@vdom:element(msg()).
view(Model) ->
lustre@element@html:table(
[],
[lustre@element@html:thead(
[],
[lustre@element@html:tr(
[],
[spectator@internal@views@table:heading(
<<"Name"/utf8>>,
<<"Table Name"/utf8>>,
sort_by_table_name,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
false
),
spectator@internal@views@table:heading(
<<"Type"/utf8>>,
<<"Table Type"/utf8>>,
sort_by_table_type,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
false
),
spectator@internal@views@table:heading(
<<"Size"/utf8>>,
<<"Table Size"/utf8>>,
sort_by_table_size,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
true
),
spectator@internal@views@table:heading(
<<"Memory"/utf8>>,
<<"Table Memory"/utf8>>,
sort_by_table_memory,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
true
),
spectator@internal@views@table:heading(
<<"Owner"/utf8>>,
<<"Table Owner"/utf8>>,
sort_by_table_owner,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
true
),
spectator@internal@views@table:heading(
<<"Protection"/utf8>>,
<<"Table Protection"/utf8>>,
sort_by_table_protection,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
true
),
spectator@internal@views@table:heading(
<<"Read Conc."/utf8>>,
<<"Table Read Concurrency"/utf8>>,
sort_by_table_read_concurrency,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
true
),
spectator@internal@views@table:heading(
<<"Write Conc."/utf8>>,
<<"Table Write Concurrency"/utf8>>,
sort_by_table_write_concurrency,
erlang:element(4, Model),
erlang:element(5, Model),
fun(Field@0) -> {heading_clicked, Field@0} end,
true
)]
)]
),
lustre@element@html:tbody(
[],
spectator@internal@views@table:map_rows(
erlang:element(3, Model),
fun(T) ->
lustre@element@html:tr(
[],
[lustre@element@html:td(
[],
link_cell(
T,
[spectator@internal@views@display:atom(
erlang:element(3, T)
)]
)
),
lustre@element@html:td(
[],
link_cell(
T,
[spectator@internal@views@display:atom(
erlang:element(4, T)
)]
)
),
lustre@element@html:td(
[lustre@attribute:class(
<<"cell-right"/utf8>>
)],
link_cell(
T,
[spectator@internal@views@display:number(
erlang:element(5, T)
),
lustre@element@html:text(
<<" items"/utf8>>
)]
)
),
lustre@element@html:td(
[lustre@attribute:class(
<<"cell-right"/utf8>>
)],
link_cell(
T,
[spectator@internal@views@display:storage_words(
erlang:element(6, T)
)]
)
),
lustre@element@html:td(
[lustre@attribute:class(
<<"cell-right"/utf8>>
)],
link_cell(
T,
[spectator@internal@views@display:pid(
erlang:element(7, T)
)]
)
),
lustre@element@html:td(
[lustre@attribute:class(
<<"cell-right"/utf8>>
)],
link_cell(
T,
[spectator@internal@views@display:atom(
erlang:element(8, T)
)]
)
),
lustre@element@html:td(
[lustre@attribute:class(
<<"cell-right"/utf8>>
)],
link_cell(
T,
[spectator@internal@views@display:bool(
erlang:element(9, T)
)]
)
),
lustre@element@html:td(
[lustre@attribute:class(
<<"cell-right"/utf8>>
)],
link_cell(
T,
[spectator@internal@views@display:bool(
erlang:element(10, T)
)]
)
)]
)
end
)
),
lustre@element@html:tfoot(
[],
[lustre@element@html:tr(
[],
[lustre@element@html:td(
[lustre@attribute:attribute(
<<"colspan"/utf8>>,
<<"8"/utf8>>
)],
[lustre@element@html:'div'(
[lustre@attribute:class(
<<"ets-footer"/utf8>>
)],
[spectator@internal@views@display:number(
erlang:length(
erlang:element(3, Model)
)
),
lustre@element@html:text(
<<" tables found in total"/utf8>>
)]
)]
)]
)]
)]
).
-file("/Users/jonas/Projects/spectator/src/spectator/internal/components/ets_overview_live.gleam", 20).
-spec app() -> lustre:app(any(), model(), msg()).
app() ->
lustre:application(fun init/1, fun update/2, fun view/1).