src/automata@fsevent@snapshot.erl

-module(automata@fsevent@snapshot).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/automata/fsevent/snapshot.gleam").
-export([empty_snapshot/0, entries/1, lookup/2, snapshot_size/1, is_empty/1, entries_unsorted/1, paths/1, entry_key/1, add_entry/2, lookup_by_key/2, from_entries/1]).
-export_type([snapshot/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.

-opaque snapshot() :: {snapshot,
        gleam@dict:dict(binary(), automata@fsevent@entry:entry())}.

-file("src/automata/fsevent/snapshot.gleam", 21).
?DOC(" A snapshot containing no entries.\n").
-spec empty_snapshot() -> snapshot().
empty_snapshot() ->
    {snapshot, maps:new()}.

-file("src/automata/fsevent/snapshot.gleam", 48).
?DOC(
    " All entries the snapshot holds, sorted by canonical path so that\n"
    " the order is deterministic across the BEAM and JavaScript targets.\n"
).
-spec entries(snapshot()) -> list(automata@fsevent@entry:entry()).
entries(Snapshot) ->
    _pipe = erlang:element(2, Snapshot),
    _pipe@1 = maps:to_list(_pipe),
    _pipe@2 = gleam@list:sort(
        _pipe@1,
        fun(A, B) ->
            {Left_key, _} = A,
            {Right_key, _} = B,
            gleam@string:compare(Left_key, Right_key)
        end
    ),
    gleam@list:map(_pipe@2, fun(Pair) -> erlang:element(2, Pair) end).

-file("src/automata/fsevent/snapshot.gleam", 60).
?DOC(" Look up the entry at `path`, if any.\n").
-spec lookup(snapshot(), automata@fsevent@path:normalized_path()) -> gleam@option:option(automata@fsevent@entry:entry()).
lookup(Snapshot, Path) ->
    case gleam_stdlib:map_get(
        erlang:element(2, Snapshot),
        automata@fsevent@path:path_to_string(Path)
    ) of
        {ok, Value} ->
            {some, Value};

        {error, _} ->
            none
    end.

-file("src/automata/fsevent/snapshot.gleam", 71).
?DOC(" Number of entries in the snapshot.\n").
-spec snapshot_size(snapshot()) -> integer().
snapshot_size(Snapshot) ->
    maps:size(erlang:element(2, Snapshot)).

-file("src/automata/fsevent/snapshot.gleam", 76).
?DOC(" `True` when the snapshot has no entries.\n").
-spec is_empty(snapshot()) -> boolean().
is_empty(Snapshot) ->
    maps:size(erlang:element(2, Snapshot)) =:= 0.

-file("src/automata/fsevent/snapshot.gleam", 81).
?DOC(false).
-spec entries_unsorted(snapshot()) -> list(automata@fsevent@entry:entry()).
entries_unsorted(Snapshot) ->
    maps:values(erlang:element(2, Snapshot)).

-file("src/automata/fsevent/snapshot.gleam", 86).
?DOC(false).
-spec paths(snapshot()) -> list(binary()).
paths(Snapshot) ->
    maps:keys(erlang:element(2, Snapshot)).

-file("src/automata/fsevent/snapshot.gleam", 91).
?DOC(false).
-spec entry_key(automata@fsevent@entry:entry()) -> binary().
entry_key(E) ->
    _pipe = E,
    _pipe@1 = automata@fsevent@entry:entry_path(_pipe),
    automata@fsevent@path:path_to_string(_pipe@1).

-file("src/automata/fsevent/snapshot.gleam", 35).
?DOC(" Insert a single entry. Rejected if the path is already present.\n").
-spec add_entry(snapshot(), automata@fsevent@entry:entry()) -> {ok, snapshot()} |
    {error, automata@fsevent@ast:fsevent_error()}.
add_entry(Snapshot, E) ->
    Key = entry_key(E),
    case gleam@dict:has_key(erlang:element(2, Snapshot), Key) of
        true ->
            {error, {duplicate_path, Key}};

        false ->
            {ok,
                {snapshot,
                    gleam@dict:insert(erlang:element(2, Snapshot), Key, E)}}
    end.

-file("src/automata/fsevent/snapshot.gleam", 98).
?DOC(false).
-spec lookup_by_key(snapshot(), binary()) -> gleam@option:option(automata@fsevent@entry:entry()).
lookup_by_key(Snapshot, Key) ->
    case gleam_stdlib:map_get(erlang:element(2, Snapshot), Key) of
        {ok, Value} ->
            {some, Value};

        {error, _} ->
            none
    end.

-file("src/automata/fsevent/snapshot.gleam", 105).
-spec insert_all(snapshot(), list(automata@fsevent@entry:entry())) -> {ok,
        snapshot()} |
    {error, automata@fsevent@ast:fsevent_error()}.
insert_all(Snapshot, Remaining) ->
    case Remaining of
        [] ->
            {ok, Snapshot};

        [Head | Rest] ->
            case add_entry(Snapshot, Head) of
                {error, Error} ->
                    {error, Error};

                {ok, Updated} ->
                    insert_all(Updated, Rest)
            end
    end.

-file("src/automata/fsevent/snapshot.gleam", 28).
?DOC(
    " Build a snapshot from a list of entries. Two entries with the\n"
    " same path is rejected as `DuplicatePath`. Entries with the same\n"
    " `file_id` but different paths are allowed (POSIX hard links).\n"
).
-spec from_entries(list(automata@fsevent@entry:entry())) -> {ok, snapshot()} |
    {error, automata@fsevent@ast:fsevent_error()}.
from_entries(Entries) ->
    insert_all(empty_snapshot(), Entries).