Packages

Tiny Gleam caching Context for your functions

Current section

Files

Jump to
functx src functx.erl
Raw

src/functx.erl

-module(functx).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([make_ctx/1, call/3]).
-spec make_ctx(FRE) -> {FRE, gleam@dict:dict(any(), any())}.
make_ctx(Data) ->
{Data, gleam@dict:new()}.
-spec call(
{FQX, gleam@dict:dict(gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_())},
fun(({FQX,
gleam@dict:dict(gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_())}) -> {FRA,
{FQX,
gleam@dict:dict(gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_())}}),
fun((FRA, {FQX,
gleam@dict:dict(gleam@dynamic:dynamic_(), gleam@dynamic:dynamic_())}) -> FRD)
) -> FRD.
call(Ctx, Fun, Cb) ->
{_, Cache} = Ctx,
case gleam@dict:get(
Cache,
begin
_pipe = Fun,
gleam@dynamic:from(_pipe)
end
) of
{ok, Resp} ->
Cb(
begin
_pipe@1 = Resp,
gleam_stdlib:identity(_pipe@1)
end,
Ctx
);
{error, nil} ->
{Resp@1, {Ctx_data, Cache@1}} = Fun(Ctx),
Cache@2 = gleam@dict:insert(
Cache@1,
begin
_pipe@2 = Fun,
gleam@dynamic:from(_pipe@2)
end,
begin
_pipe@3 = Resp@1,
gleam@dynamic:from(_pipe@3)
end
),
Cb(Resp@1, {Ctx_data, Cache@2})
end.