README.md

# BackPipe

[![hex.pm version](https://img.shields.io/hexpm/v/back_pipe.svg)](https://hex.pm/packages/back_pipe)

A simple backwards pipe operator for Elixir via the `~>` operator. Lets you pipe the output of preceding logic into the final argument position of the next function.

### Why?

Why not!

But really, this is mostly an experiment. Elixir provides both a set of reserved operators that can be overloaded and a macro system to do so. Plus, the backwards pipe operator is not a novel concept. Some other functional languages like F#, have them. This is a study of what it could look like in Elixir.

Also, it does feel useful for the small handful of cases where the final argument in a function is often the result of a chain (i.e. pipeline) of operations, like when calling `struct/2` to dynamically generating new structs.

## Docs

On [Hexdocs](https://hexdocs.pm/back_pipe/BackPipe.html)

## Installation

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

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

## Examples

```elixir
# Basic usage
iex> "hello world" ~> String.split()
["hello", "world"]

# We can chain too
"hello world"
~> String.split()
~> Enum.concat(["oh"])
|> Enum.join(" ")
# "oh hello world"

# More useful: dynamically creating a struct
defmodule Traveler do
  defstruct [:id, :name, :location]

  def new(kwl) do
    kwl
    |> Map.new()
    |> Map.put(:location, "Unknown")
    ~> struct(__MODULE__)
  end
end

iex> Traveler.new(id: 1, name: "Hal")
%Traveler{id: 1, location: "Unknown", name: "Hal"}
```