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