README.md

# Traverse

[![Build Status](https://travis-ci.org/RobertDober/traverse.svg?branch=master)](https://travis-ci.org/RobertDober/traverse)
[![Hex.pm](https://img.shields.io/hexpm/v/traverse.svg)](https://hex.pm/packages/traverse)
[![Coverage Status](https://coveralls.io/repos/RobertDober/traverse/badge.png)](https://coveralls.io/r/RobertDober/traverse)
[![Inline docs](http://inch-ci.org/github/RobertDober/traverse.svg?branch=master)](http://inch-ci.org/github/RobertDober/traverse)

<!-- moduledoc: Traverse -->
## Traverse is a toolset to walk arbitrary Elixir Datastructures.

`walk` visits all substructures down to atomic elements.

    iex>    ds = [:a, {:b, 1, 2}, [:c, 3, 4, 5]]
    ...>    collector =  fn ele, acc when is_atom(ele) or is_number(ele) -> [ele|acc]
    ...>                    _,   acc                    -> acc       end
    ...>    Traverse.walk(ds, [], collector)
    [5, 4, 3, :c, 2, 1, :b, :a]

 One can return the accumulator boxed in a `%Cut{}` struct to avoid traversal of the
 subtree.

    iex>   ds = [add: [1, 2], ignore: [3, 4]]
    ...>   collector = fn {:ignore, _}, acc        -> %Traverse.Cut{acc: acc}
    ...>                  n, acc when is_number(n) -> [n|acc]
    ...>                  _, acc                   -> acc end
    ...>   Traverse.walk(ds, [], collector)
    [2, 1]
<!-- endmoduledoc: Traverse -->

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed as:

  1. Add `traverse` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [{:traverse, "~> 0.1.0"}]
    end
    ```

  2. Ensure `traverse` is started before your application:

    ```elixir
    def application do
      [applications: [:traverse]]
    end
    ```