Packages
oaspec
0.54.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
src/oaspec_naming_ffi.erl
%% Issue #405: persistent_term-backed memoization for the three
%% pre-compiled regexes used by `oaspec/internal/util/naming`. Without
%% this, every `to_pascal_case/1` and `to_snake_case/1` call compiles
%% the same three regexes from scratch — on a 10k-schema spec that's
%% 30k+ wasted compiles per generate run.
%%
%% `persistent_term` is the right primitive here because the cached
%% values are written exactly once per BEAM process lifetime (the first
%% caller wins) and read O(1) by every subsequent caller, with no
%% GC pressure on a hot path. The compute fun is a Gleam closure
%% returning the same `gleam/regexp` Regexp record the rest of the
%% naming module already deals with — `persistent_term` stores it
%% verbatim, no encoding tricks.
-module(oaspec_naming_ffi).
-export([memoize/2]).
memoize(Key, Compute) ->
case persistent_term:get(Key, undefined) of
undefined ->
Result = Compute(),
persistent_term:put(Key, Result),
Result;
Cached ->
Cached
end.