# `Isotope`
[🔗](https://codeberg.org/sickday/Isotope118/src/branch/main/lib/isotope.ex#L1)

Elixir bindings to Rust's [bracket-noise](https://crates.io/crates/bracket-noise)
library, which is a Rust port of [FastNoise Lite](https://github.com/Auburn/FastNoiseLite).

Implemented using [NIFs](https://erlang.org/doc/tutorial/nif.html) for performance.
Noise maps are returned as compact binaries of packed `f32` values, using ~4 bytes
per value instead of ~32 bytes for nested Elixir lists.

## Quick Start

    # Create a noise generator
    {:ok, noise} = Isotope.Noise.new(%Isotope.Options{
      seed: 42,
      noise_type: :simplex_fractal,
      frequency: 0.01,
      fractal_options: %Isotope.Options.Fractal{octaves: 4}
    })

    # Generate a noise map
    nm = Isotope.Noise.noise_map(noise, {100, 100})

    # Access values
    Isotope.NoiseMap.get(nm, 50, 50)   # single value
    Isotope.NoiseMap.row(nm, 0)         # first row as list
    Isotope.NoiseMap.to_list(nm)        # full nested list

    # Works with Enum (iterates rows)
    Enum.map(nm, fn row -> Enum.sum(row) / length(row) end)

## Modules

- `Isotope.Noise` — create noise generators, sample individual points,
  and generate noise maps or chunks.

- `Isotope.NoiseMap` — compact struct wrapping noise map data with accessors
  for individual values, rows, and conversion to lists. Implements `Enumerable`.

- `Isotope.Options` — configuration for noise type, frequency, seed,
  fractal parameters, and cellular parameters.

- `Isotope.Utils` — visualization utilities (ANSI terminal output).

---

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