-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.