     search([state])
   end
 
-  def search([], _visited), do: :end_not_found
+  # Breadth First Search
+  def search([], _visited \\ MapSet.new()), do: :end_not_found
 
-  # Let's begin with a reasonable breadth first search to see how far that takes us.
-  def search([current | rest] = _open, discovered \\ MapSet.new()) do
+  def search([current | rest] = _open, discovered) do
     cond do
       State.is_end?(current) ->
         # NOTE: For part A it should find it 31 hops in.

          %Generator{identifier: :thulium},
          %Microchip{identifier: :thulium},
          %Generator{identifier: :plutonium},
          %Generator{identifier: :strontium}
        ]),
        Floor.new([
          %Microchip{identifier: :plutonium},

    end
  end

  def get_initial_state(part \\ :part_b)

  def get_initial_state(:part_a) do
    # hardcoded the initial state since parsing the input is not the challanging
    # part of this puzzle..
    %State{
      elevator_location: 0,
      floors: [
        Floor.new([
          %Generator{identifier: :thulium},
          %Microchip{identifier: :thulium},
          %Generator{identifier: :plutonium}
        ]),
        Floor.new([
          %Microchip{identifier: :plutonium},
          %Microchip{identifier: :strontium}
        ]),
        Floor.new([
          %Generator{identifier: :promethium},
          %Microchip{identifier: :promethium},
          %Generator{identifier: :ruthenium},
          %Microchip{identifier: :ruthenium}
        ]),
        Floor.new([])
      ]
    }
  end

  def get_initial_state(:part_b) do
    # hardcoded the initial state since parsing the input is not the challanging
    # part of this puzzle..
    %State{
