Skip to main content

src/examples@paginate_scrobbles.erl

-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>>
    ).