Skip to main content

lib/ex_codecs/compression.ex

defmodule ExCodecs.Compression do
  @moduledoc """
  Compression codec category for ExCodecs.

  This module serves as a namespace for compression codecs and provides
  category-level utilities for comparing and selecting compression algorithms.

  ## Available Codecs

    * `ExCodecs.Compression.Zstd` — High ratio, good speed
    * `ExCodecs.Compression.Lz4` — Extremely fast compression
    * `ExCodecs.Compression.Snappy` — Fast with low overhead
    * `ExCodecs.Compression.Bzip2` — High compression ratio
    * `ExCodecs.Compression.Blosc2` — Meta-compressor for array data

  ## Compression vs Encoding

  In ExCodecs, compression is encoding — and decompression is decoding.
  This consistent terminology spans all codec categories:

      # These are equivalent
      ExCodecs.encode(:zstd, data)     # compress
      ExCodecs.decode(:zstd, data)     # decompress
  """

  alias ExCodecs.CodecRegistry

  @doc """
  Returns all available compression codecs.

  Returns a list of `%ExCodecs.Codec{}` structs sorted by name.

  ## Examples

      iex> codecs = ExCodecs.Compression.available_codecs()
      iex> is_list(codecs) and length(codecs) >= 5
      true
  """
  @spec available_codecs() :: [ExCodecs.Codec.t()]
  def available_codecs do
    CodecRegistry.codecs_by_category(:compression)
  end

  @doc """
  Compresses data with the specified codec.

  Shortcut for `ExCodecs.encode/3`.
  """
  @spec compress(atom(), binary(), keyword()) :: {:ok, binary()} | {:error, ExCodecs.Error.t()}
  def compress(codec, data, opts \\ []) do
    ExCodecs.encode(codec, data, opts)
  end

  @doc """
  Decompresses data with the specified codec.

  Shortcut for `ExCodecs.decode/3`.
  """
  @spec decompress(atom(), binary(), keyword()) :: {:ok, binary()} | {:error, ExCodecs.Error.t()}
  def decompress(codec, data, opts \\ []) do
    ExCodecs.decode(codec, data, opts)
  end
end