defmodule Explorer do
@moduledoc """
Explorer brings series (one-dimensional) and dataframes (two-dimensional)
for fast data exploration to Elixir.
Most of the functionality in `Explorer` is in `Explorer.DataFrame` and
`Explorer.Series`. Refer to those modules for more in-depth documentation.
This module only handles the default backend for `Explorer`. The default
backend is read from the application environment. Currently, the only backend
is an in-memory, eager one based on
[`Polars`](https://github.com/pola-rs/polars). When alternatives are
available, you can use them by configuring your runtime:
# config/runtime.exs
import Config
config :explorer, default_backend: Lib.CustomBackend
"""
## Backend API
@backend_key {Explorer, :default_backend}
@doc """
Sets the current process default backend to `backend`.
The default backend is stored only in the process dictionary. This means if
you start a separate process, such as `Task`, the default backend must be set
on the new process too.
## Examples
iex> Explorer.default_backend(Lib.CustomBackend)
Explorer.PolarsBackend
iex> Explorer.default_backend()
Lib.CustomBackend
"""
def default_backend(backend) do
Process.put(@backend_key, backend!(backend)) ||
backend!(Application.fetch_env!(:explorer, :default_backend))
end
@doc """
Gets the default backend for the current process.
"""
def default_backend do
Process.get(@backend_key) || backend!(Application.fetch_env!(:explorer, :default_backend))
end
## Helpers
defp backend!(backend) when is_atom(backend),
do: backend
defp backend!(other) do
raise ArgumentError,
"backend must be an atom, got: #{inspect(other)}"
end
end