-module(examples@paginate_scrobbles).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/examples/paginate_scrobbles.gleam").
-export([main/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(
" Walk through every scrobble for an actor by following the `offset` cursor.\n"
"\n"
" Run with:\n"
" gleam run -m examples/paginate_scrobbles\n"
).
-file("src/examples/paginate_scrobbles.gleam", 47).
-spec print_batch(
list(rocksky@generated@types:scrobble_view_basic()),
integer()
) -> nil.
print_batch(Batch, Start_offset) ->
gleam@list:index_fold(
Batch,
nil,
fun(_, Scrobble, I) ->
gleam_stdlib:println(
<<<<<<<<(erlang:integer_to_binary(Start_offset + I))/binary,
": "/utf8>>/binary,
(gleam@option:unwrap(
erlang:element(6, Scrobble),
<<"?"/utf8>>
))/binary>>/binary,
" — "/utf8>>/binary,
(gleam@option:unwrap(
erlang:element(7, Scrobble),
<<"?"/utf8>>
))/binary>>
),
nil
end
).
-file("src/examples/paginate_scrobbles.gleam", 22).
-spec walk(rocksky:client(), binary(), integer(), integer()) -> integer().
walk(Client, Did, Offset, Counted) ->
Result = begin
_pipe = rocksky@actor:get_actor_scrobbles(Did),
_pipe@1 = rocksky:limit(_pipe, 50),
_pipe@2 = rocksky:offset(_pipe@1, Offset),
rocksky:send(_pipe@2, Client)
end,
case Result of
{ok, Batch} ->
N = erlang:length(Batch),
print_batch(Batch, Offset),
case N < 50 of
true ->
Counted + N;
false ->
walk(Client, Did, Offset + N, Counted + N)
end;
{error, _} ->
Counted
end.
-file("src/examples/paginate_scrobbles.gleam", 16).
-spec main() -> nil.
main() ->
Client = rocksky:new(),
Total = walk(Client, <<"tsiry.bsky.social"/utf8>>, 0, 0),
gleam_stdlib:println(
<<<<"done — counted "/utf8, (erlang:integer_to_binary(Total))/binary>>/binary,
" scrobbles"/utf8>>
).