     cond do
       options[:help] or (0 < length invalid) ->
         usage
+      options[:benchmark] ->
+        benchmark
       true ->
         process(remaining, options)
     end

    IO.puts("    -c          : operate on sets of characters instead of sets of strings")
    IO.puts("    --strip     : strip leading and trailing whitespace from set items")
    IO.puts("    -s          : strip leading and trailing whitespace from set items")
    IO.puts("    --help      : display this usage summary")
    IO.puts("    -?          : display this usage summary")
    IO.puts("Examples:")

#   ./symmetric_difference.exs

defmodule CustomSet do
  def symmetricDifference_IntersectionDifference(pSetA, pSetB) do
    setA = MapSet.new(pSetA)
    setB = MapSet.new(pSetB)
    union = MapSet.union(setA, setB)
    intersection = MapSet.intersection(setA, setB)
    MapSet.difference(union, intersection)
    |> MapSet.to_list
  end

  # FEEDBACK:
  #   benchmark your formula of union(a,b)\intersection(a,b) with union(a\b,b\a)
  #   just curious about relative costs. does 1U+1I+1D cost less or more than 2D+1U
  #
  # ANSWER:
  #   2D+1U appears to be slightly faster when operating on multiple large sets
  def symmetricDifference_DifferenceUnion(pSetA, pSetB) do
    setA = MapSet.new(pSetA)
    setB = MapSet.new(pSetB)
    differenceA = MapSet.difference(setA, setB)
    differenceB = MapSet.difference(setB, setA)
    MapSet.union(differenceA, differenceB)
    |> MapSet.to_list
  end
end

defmodule Benchmark do
  def measure(function) do
    function
    |> :timer.tc
    |> elem(0)
    |> Kernel./(1_000_000)
  end
end

