lib/util.ex

defmodule MixErlangTasks.Util do
  def filter_opts(opts) do
    Enum.reduce(opts, [], fn
      {name, nil}, acc -> [name|acc]
      {name, val}, acc -> [name, val | acc]
    end)
  end

  def compile_files(files, dir) do
    File.mkdir_p!(dir)

    status = Enum.reduce(files, :ok, fn path, status ->
      case :compile.file(String.to_charlist(path),
        [{:outdir, String.to_charlist(dir)}, :report]) do
        {:ok, _} -> IO.puts "Compiled #{path}"; status
        :error -> :error
      end
    end)
    if status == :error, do:  Mix.raise "Encountered compilation errors"

    Code.prepend_path(dir)
  end
end