Current section
Files
Jump to
Current section
Files
src/radiate.erl
-module(radiate).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
-export([new/0, add_dir/2, on_reload/2, set_initializer/2, start_state/1, start/1]).
-export_type([no_directories/0, has_directories/0, no_initializer/0, has_initializer/0, builder/3, module_/0, what/0]).
-type no_directories() :: any().
-type has_directories() :: any().
-type no_initializer() :: any().
-type has_initializer() :: any().
-opaque builder(HRS, HRT, HRU) :: {builder,
list(binary()),
gleam@option:option(fun((HRS, binary()) -> HRS)),
gleam@option:option(fun(() -> HRS))} |
{gleam_phantom, HRT, HRU}.
-type module_() :: any().
-type what() :: any().
-spec new() -> builder(nil, no_directories(), no_initializer()).
new() ->
{builder, [], none, none}.
-spec add_dir(builder(HRY, any(), HSA), binary()) -> builder(HRY, has_directories(), HSA).
add_dir(Builder, Dir) ->
{builder,
[Dir | erlang:element(2, Builder)],
erlang:element(3, Builder),
erlang:element(4, Builder)}.
-spec on_reload(builder(HSH, HSI, HSJ), fun((HSH, binary()) -> HSH)) -> builder(HSH, HSI, HSJ).
on_reload(Builder, Callback) ->
{builder,
erlang:element(2, Builder),
{some, Callback},
erlang:element(4, Builder)}.
-spec set_initializer(builder(HSQ, HSR, no_initializer()), fun(() -> HSQ)) -> builder(HSQ, HSR, has_initializer()).
set_initializer(Builder, Initializer) ->
{builder,
erlang:element(2, Builder),
erlang:element(3, Builder),
{some, Initializer}}.
-spec start_state(builder(any(), has_directories(), has_initializer())) -> {ok,
gleam@erlang@process:subject(filespy:change())} |
{error, gleam@otp@actor:start_error()}.
start_state(Builder) ->
_pipe = filespy:new(),
_pipe@1 = filespy:set_initializer(
_pipe,
fun() ->
_assert_subject = erlang:element(4, Builder),
{some, Init} = case _assert_subject of
{some, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"radiate"/utf8>>,
function => <<"start_state"/utf8>>,
line => 97})
end,
Init()
end
),
_pipe@2 = filespy:add_dirs(_pipe@1, erlang:element(2, Builder)),
_pipe@5 = filespy:set_actor_handler(
_pipe@2,
fun(Msg, State) ->
{change, Path, Events} = Msg,
_pipe@4 = gleam@list:fold(
Events,
State,
fun(State@1, 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),
case erlang:element(3, Builder) of
{some, Cb} ->
Cb(State@1, Path);
none ->
State@1
end;
{error, {_, Message}} ->
_pipe@3 = Message,
gleam@io:print_error(_pipe@3),
State@1
end;
_ ->
State@1
end;
_ ->
State@1
end end
),
gleam@otp@actor:continue(_pipe@4)
end
),
filespy:start(_pipe@5).
-spec start(builder(nil, has_directories(), no_initializer())) -> {ok,
gleam@erlang@process:subject(filespy:change())} |
{error, gleam@otp@actor:start_error()}.
start(Builder) ->
_pipe = Builder,
_pipe@1 = set_initializer(_pipe, fun() -> nil end),
start_state(_pipe@1).