Contracts
=========
[](https://travis-ci.org/ruby2elixir/elixir-contracts)
[](https://hex.pm/packages/contracts)

Design by Contract for Elixir
Usage
======
```elixir
use Contracts
requires x > 0
ensures (result * result) <= x && (result+1) * (result+1) > x
def sqrt(x) do
  :math.sqrt(x)
end
```
### Bigger example
```elixir
defmodule Tank do
  defstruct level: 0, max_level: 10, in_valve: :closed, out_valve: :closed
  use Contracts
  requires not full?(tank) && tank.in_valve == :open && tank.out_valve == :closed
  ensures full?(result) && result.in_valve == :closed && result.out_valve == :closed
  def fill(tank) do
    %Tank{tank | level: 10, in_valve: :closed}
  end
  requires tank.in_valve == :closed && tank.out_valve == :open
  ensures empty?(result) && result.in_valve == :closed && result.out_valve == :closed
  def empty(tank) do
    %Tank{tank | level: 1, out_valve: :closed}
    # %Tank{tank | level: 0, out_valve: :closed} # correct implementation
  end
  def full?(tank) do
    tank.level == tank.max_level
  end
  def empty?(tank) do
    tank.level == 0
  end
end
```