defmodule TruthTable do @moduledoc """ Documentation for TruthTable. """ use Bitwise, only_operators: true @doc """ Generate all combinations of `size` boolean values. There is no order guarantee. ## Examples iex> 2 |> TruthTable.inputs() |> MapSet.new() MapSet.new([[false, false], [false, true], [true, true], [true, false]]) """ def inputs(size) when is_integer(size) and size >= 0 do 1 |> Bitwise.<<<(size) |> Kernel.-(1) |> Range.new(0) |> Enum.map(&generate_row(size, &1, [])) end def inputs(size) do raise ArgumentError, "Expected non-negative integer, got: #{inspect(size)}" end defp generate_row(0, _value, row) do row end defp generate_row(count, value, row) do generate_row(count - 1, value >>> 1, [invert(value &&& 1) | row]) end defp invert(0), do: true defp invert(_), do: false end