Current section
Files
Jump to
Current section
Files
src/sketch_css@module@dependencies.erl
-module(sketch_css@module@dependencies).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/sketch_css/module/dependencies.gleam").
-export([reject_cycles/3, all_imports/3]).
-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(false).
-file("src/sketch_css/module/dependencies.gleam", 7).
?DOC(false).
-spec reject_cycles(
{binary(), glance:module_()},
list(binary()),
list({binary(), glance:module_()})
) -> {ok, nil} | {error, snag:snag()}.
reject_cycles(Module, Visited, Modules) ->
Modules_ = gleam@list:map(
erlang:element(2, (erlang:element(2, Module))),
fun(I) -> erlang:element(2, erlang:element(3, I)) end
),
case gleam@list:any(
Modules_,
fun(Module@1) -> gleam@list:contains(Visited, Module@1) end
) of
true ->
snag:error(
<<"cycle detected in module: "/utf8,
(erlang:element(1, Module))/binary>>
);
false ->
By_name = fun(Name) ->
gleam@list:find(
Modules,
fun(M) -> erlang:element(1, M) =:= Name end
)
end,
_pipe = gleam@list:filter_map(Modules_, By_name),
_pipe@1 = gleam@list:try_map(
_pipe,
fun(_capture) ->
reject_cycles(
_capture,
[erlang:element(1, Module) | Visited],
Modules
)
end
),
gleam@result:replace(_pipe@1, nil)
end.
-file("src/sketch_css/module/dependencies.gleam", 24).
?DOC(false).
-spec all_imports(
{binary(), glance:module_()},
list({binary(), glance:module_()}),
list(binary())
) -> list(binary()).
all_imports(Module, Modules, Visited) ->
Imports = gleam@list:map(
erlang:element(2, (erlang:element(2, Module))),
fun(I) -> erlang:element(2, erlang:element(3, I)) end
),
Visited@1 = [erlang:element(1, Module) | Visited],
Modules_ = gleam@list:filter_map(
Imports,
fun(I@1) ->
gleam@list:find(Modules, fun(M) -> erlang:element(1, M) =:= I@1 end)
end
),
_pipe = gleam@list:flat_map(
Modules_,
fun(_capture) -> all_imports(_capture, Modules, Visited@1) end
),
_pipe@1 = lists:append(_pipe, Imports),
_pipe@2 = gleam@list:unique(_pipe@1),
gleam@list:sort(_pipe@2, fun gleam@string:compare/2).