# `Localize.DataLoader`
[🔗](https://github.com/elixir-localize/localize/blob/v0.38.0/lib/localize/data_loader.ex#L1)

A GenServer that serializes ETF data file loading to prevent
race conditions.

When multiple processes request the same data concurrently,
the first request triggers the load and subsequent requests
wait for it to complete. This avoids duplicate file reads and
redundant `:persistent_term.put/2` calls (each of which
triggers a global GC).

The server is started as part of the `Localize` supervision
tree. All ETF file loading goes through `load/2`.

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `load`

```elixir
@spec load(term(), (-&gt; term())) :: term()
```

Loads an ETF data file, serialized through the GenServer.

If the data is already cached in `:persistent_term`, returns
it immediately without contacting the server. Otherwise,
delegates to the GenServer which ensures only one load per
key occurs.

### Arguments

* `key` is the `:persistent_term` key (e.g.,
  `{:localize, :supplemental, "aliases.etf"}`).

* `load_fn` is a zero-arity function that reads and decodes
  the file, returning the data to be cached.

### Returns

* The loaded data.

# `start_link`

Starts the data loader GenServer.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
