Current section

Files

Jump to
bath src bath.erl
Raw

src/bath.erl

-module(bath).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([shutdown/3, force_shutdown/2, apply/3, init/2]).
-export_type([msg/1, pool_state/1, pool/1, init_error/1, shutdown_error/0, apply_error/0]).
-type msg(HLY) :: {check_in, HLY} |
{check_out,
gleam@erlang@process:subject({ok, HLY} | {error, apply_error()})} |
{shutdown,
fun((HLY) -> nil),
gleam@erlang@process:subject({ok, nil} | {error, shutdown_error()})} |
{force_shutdown, fun((HLY) -> nil)}.
-type pool_state(HLZ) :: {pool_state, list(HLZ), list(HLZ)}.
-opaque pool(HMA) :: {pool, integer(), gleam@erlang@process:subject(msg(HMA))}.
-type init_error(HMB) :: {start_error, gleam@otp@actor:start_error()} |
{resource_create_error, HMB}.
-type shutdown_error() :: resources_in_use |
shutdown_timeout |
{callee_down, gleam@dynamic:dynamic_()}.
-type apply_error() :: no_resources_available | checkout_timeout.
-file("/Users/isaac/repos/bath/src/bath.gleam", 109).
-spec shutdown(pool(HMR), fun((HMR) -> nil), integer()) -> {ok, nil} |
{error, shutdown_error()}.
shutdown(Pool, Resource_shutdown_function, Timeout) ->
_pipe = gleam@erlang@process:try_call(
erlang:element(3, Pool),
fun(_capture) -> {shutdown, Resource_shutdown_function, _capture} end,
Timeout
),
_pipe@1 = gleam@result:map_error(_pipe, fun(Err) -> case Err of
call_timeout ->
shutdown_timeout;
{callee_down, Reason} ->
{callee_down, Reason}
end end),
gleam@result:flatten(_pipe@1).
-file("/Users/isaac/repos/bath/src/bath.gleam", 133).
-spec force_shutdown(pool(HMU), fun((HMU) -> nil)) -> nil.
force_shutdown(Pool, Resource_shutdown_function) ->
gleam@erlang@process:send(
erlang:element(3, Pool),
{force_shutdown, Resource_shutdown_function}
).
-file("/Users/isaac/repos/bath/src/bath.gleam", 140).
-spec check_out(gleam@erlang@process:subject(msg(HMX)), integer()) -> {ok, HMX} |
{error, apply_error()}.
check_out(Pool_subject, Timeout) ->
_pipe = gleam@erlang@process:try_call(
Pool_subject,
fun(Field@0) -> {check_out, Field@0} end,
Timeout
),
_pipe@1 = gleam@result:replace_error(_pipe, checkout_timeout),
gleam@result:flatten(_pipe@1).
-file("/Users/isaac/repos/bath/src/bath.gleam", 146).
-spec check_in(gleam@erlang@process:subject(msg(HNA)), HNA) -> nil.
check_in(Pool_subject, Item) ->
gleam@erlang@process:send(Pool_subject, {check_in, Item}).
-file("/Users/isaac/repos/bath/src/bath.gleam", 94).
-spec apply(pool(HMN), integer(), fun((HMN) -> HMP)) -> {ok, HMP} |
{error, apply_error()}.
apply(Pool, Timeout, Next) ->
gleam@result:'try'(
check_out(erlang:element(3, Pool), Timeout),
fun(Resource) ->
Result = Next(Resource),
check_in(erlang:element(3, Pool), Resource),
{ok, Result}
end
).
-file("/Users/isaac/repos/bath/src/bath.gleam", 153).
-spec handle_message(msg(HNC), pool_state(HNC)) -> gleam@otp@actor:next(any(), pool_state(HNC)).
handle_message(Msg, Pool_state) ->
case Msg of
{check_in, Resource} ->
Checked_out = begin
_pipe = erlang:element(3, Pool_state),
gleam@list:filter(_pipe, fun(Item) -> Item /= Resource end)
end,
Checked_in = [Resource | erlang:element(2, Pool_state)],
gleam@otp@actor:continue({pool_state, Checked_in, Checked_out});
{check_out, Client} ->
case erlang:element(2, Pool_state) of
[] ->
gleam@otp@actor:send(
Client,
{error, no_resources_available}
),
gleam@otp@actor:continue(Pool_state);
[Chosen | Checked_in@1] ->
gleam@otp@actor:send(Client, {ok, Chosen}),
gleam@otp@actor:continue(
{pool_state,
Checked_in@1,
[Chosen | erlang:element(3, Pool_state)]}
)
end;
{shutdown, Resource_shutdown_function, Reply_to} ->
case erlang:element(3, Pool_state) of
[] ->
_pipe@1 = erlang:element(2, Pool_state),
gleam@list:each(_pipe@1, Resource_shutdown_function),
gleam@erlang@process:send(Reply_to, {ok, nil}),
{stop, normal};
_ ->
gleam@erlang@process:send(
Reply_to,
{error, resources_in_use}
),
gleam@otp@actor:continue(Pool_state)
end;
{force_shutdown, Resource_shutdown_function@1} ->
_pipe@2 = lists:append(
erlang:element(2, Pool_state),
erlang:element(3, Pool_state)
),
gleam@list:each(_pipe@2, Resource_shutdown_function@1),
{stop, normal}
end.
-file("/Users/isaac/repos/bath/src/bath.gleam", 62).
-spec init(integer(), fun(() -> {ok, HMF} | {error, HMG})) -> {ok, pool(HMF)} |
{error, init_error(HMG)}.
init(Size, Resource_create_function) ->
Resources_result = begin
_pipe = gleam@list:repeat(<<""/utf8>>, Size),
gleam@list:try_map(
_pipe,
fun(_) -> _pipe@1 = Resource_create_function(),
gleam@result:map_error(
_pipe@1,
fun(Field@0) -> {resource_create_error, Field@0} end
) end
)
end,
gleam@result:'try'(
Resources_result,
fun(Resources) ->
Actor_result = begin
_pipe@2 = gleam@otp@actor:start(
{pool_state, Resources, []},
fun handle_message/2
),
gleam@result:map_error(
_pipe@2,
fun(Field@0) -> {start_error, Field@0} end
)
end,
gleam@result:'try'(
Actor_result,
fun(Subject) -> {ok, {pool, Size, Subject}} end
)
end
).