-module(radiate). -compile([no_auto_import, nowarn_unused_vars]). -export([new/0, add_dir/2, on_reload/2, start/1]). -export_type([no_directories/0, has_directories/0, builder/1, module_/0, what/0]). -type no_directories() :: any(). -type has_directories() :: any(). -opaque builder(HNN) :: {builder, list(binary()), list(fun((binary()) -> nil))} | {gleam_phantom, HNN}. -type module_() :: any(). -type what() :: any(). -spec new() -> builder(no_directories()). new() -> {builder, [], []}. -spec add_dir(builder(any()), binary()) -> builder(has_directories()). add_dir(Builder, Dir) -> {builder, [Dir | erlang:element(2, Builder)], erlang:element(3, Builder)}. -spec on_reload(builder(HNS), fun((binary()) -> nil)) -> builder(HNS). on_reload(Builder, Callback) -> {builder, erlang:element(2, Builder), [Callback | erlang:element(3, Builder)]}. -spec start(builder(has_directories())) -> {ok, gleam@erlang@process:subject(filespy:change())} | {error, gleam@otp@actor:start_error()}. start(Builder) -> _pipe = filespy:new(), _pipe@1 = filespy:add_dirs(_pipe, erlang:element(2, Builder)), _pipe@3 = filespy:set_handler(_pipe@1, fun(Path, Event) -> case Event of closed -> case gleam@string:ends_with(Path, <<".gleam"/utf8>>) of true -> Build_result = shellout:command( <<"gleam"/utf8>>, [<<"build"/utf8>>], <<"."/utf8>>, [] ), case Build_result of {ok, _} -> Mods = code:modified_modules(), gleam@list:each(Mods, fun code:purge/1), _ = code:atomic_load(Mods), gleam@list:each( erlang:element(3, Builder), fun(Callback) -> Callback(Path) end ), nil; {error, {_, Message}} -> _pipe@2 = Message, gleam@io:print_error(_pipe@2) end; _ -> nil end; _ -> nil end end), filespy:start(_pipe@3).