Current section
Files
Jump to
Current section
Files
src/smut.erl
-module(smut).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/smut.gleam").
-export([new/1, set/2, get/1]).
-export_type([msg/1, state/1]).
-type msg(EAQ) :: {assign, EAQ} |
{update, gleam@erlang@process:subject(EAQ), fun((EAQ) -> EAQ)} |
{retrieve, gleam@erlang@process:subject(EAQ)}.
-opaque state(EAR) :: {handle, gleam@erlang@process:subject(msg(EAR))}.
-file("src/smut.gleam", 13).
-spec run(EAS, gleam@erlang@process:subject(msg(EAS))) -> nil.
run(State, Pipe) ->
case gleam_erlang_ffi:'receive'(Pipe) of
{assign, New_state} ->
run(New_state, Pipe);
{update, Return_pipe, With} ->
gleam@erlang@process:send(Return_pipe, State),
_pipe = With(State),
run(_pipe, Pipe);
{retrieve, Return_pipe@1} ->
gleam@erlang@process:send(Return_pipe@1, State),
run(State, Pipe)
end.
-file("src/smut.gleam", 27).
-spec new(EAV) -> state(EAV).
new(Initial_state) ->
Back_channel = gleam@erlang@process:new_subject(),
proc_lib:spawn_link(
fun() ->
Pipe = gleam@erlang@process:new_subject(),
gleam@erlang@process:send(Back_channel, Pipe),
run(Initial_state, Pipe)
end
),
Pipe@1 = gleam_erlang_ffi:'receive'(Back_channel),
{handle, Pipe@1}.
-file("src/smut.gleam", 40).
-spec set(EAX, state(EAX)) -> nil.
set(New, Handle) ->
{handle, Send} = Handle,
gleam@erlang@process:send(Send, {assign, New}).
-file("src/smut.gleam", 45).
-spec get(state(EBA)) -> EBA.
get(Handle) ->
Return = gleam@erlang@process:new_subject(),
{handle, Send} = Handle,
gleam@erlang@process:send(Send, {retrieve, Return}),
gleam_erlang_ffi:'receive'(Return).