     end
   end
 
-  @spec do_diff(binary | integer | float, binary | integer | float) :: map | nil
+  @spec do_diff(binary | integer | float, binary | integer | float, list) :: map | nil
   defp do_diff(i1, i2, opts) when not (is_list(i1) and is_list(i2))
                     and not (is_map(i1) and is_map(i2)) do
     compare = if Keyword.get(opts, :strict_equality, @default_strict_equality) do

      {_, []} -> new_list
      {check, deleted} ->
        deleted_map = Enum.into(deleted, %{})
        all_checked(check, deleted_map)
    end
    if diff != %{} do
      diff

  end


  @spec all_checked(list, map, list) :: list
  defp all_checked([], deleted_map, _) do
    Map.to_list(deleted_map)
  end

  defp all_checked([head | tail], deleted_map, opts) do
    case head do
      {i, [value]} when is_map(value) ->
        neg_i = "_" <> i
        case Map.fetch(deleted_map, neg_i) do
          {:ok, [value2, 0, 0]} -> [{i, do_diff(value2, value, opts)} | all_checked(tail, Map.delete(deleted_map, neg_i), opts)]
          :error -> [head | all_checked(tail, deleted_map, opts)]
        end
      _ -> [head | all_checked(tail, deleted_map, opts)]
    end
  end

  @spec do_diff(list, list, list) :: map | nil
  defp do_diff(l1, l2, opts) when is_list(l1) and is_list(l2) do
    new_list = List.myers_difference(l1, l2)
    |> Enum.reduce({0, %{}}, fn
