Skip to content
Basic exhaustiveness checking of unions in Elixir
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
lib
test
.formatter.exs
.gitignore
LICENCE
README.md
mix.exs
mix.lock

README.md

Total

Simple exhaustiveness checking of tuple + atom based unions.

defmodule MyType do
  require Total

  # define a union
  Total.defunion(method() :: :get | :post | {:other, term()})
end

defmodule Elsewhere do
  require MyType

  # This is OK, all variants are covered
  def method_string(m) do
    MyType.method_case m do
      :get -> "GET"
      :post -> "POST"
      {:other, t} -> t
    end
  end

  # This is a compile time error: missing `{:other, term()}`
  def method_string(m) do
    MyType.method_case m do
      :get -> "GET"
      :post -> "POST"
    end
  end
end

The exhaustiness checking is very basic: bare atoms are checked and tuples have their tag and length checked, but their arguments are unchecked.

All other terms and guard clauses are ignored.

Installation

def deps do
  [
    {:total, "~> 0.1.0"}
  ]
end
You can’t perform that action at this time.