   The returned value is a two-element tuple with the "get" value returned by
   `fun` and a new container with the updated value under `key`.
   """
-  @spec get_and_update(data, key, (value -> {get_value, value} | :pop)) ::
-        {get_value, data} when get_value: var, data: container
+  @spec get_and_update(data, key, (value -> {get_value, value} | :pop)) :: {get_value, data}
+        when get_value: var,
+             data: container
   def get_and_update(container, key, fun)
 
   def get_and_update(%module{} = container, key, fun) do
     module.get_and_update(container, key, fun)
   rescue
     exception in UndefinedFunctionError ->
-      raise_undefined_behaviour exception, module, {^module, :get_and_update, [^container, ^key, ^fun], _}
+      raise_undefined_behaviour(exception, module, {
+        ^module,
+        :get_and_update,
+        [^container, ^key, ^fun],
+        _
+      })
   end
 
   def get_and_update(map, key, fun) when is_map(map) do


  defmacrop raise_undefined_behaviour(exception, module, top) do
    quote do
      stacktrace = System.stacktrace
      exception =
        case stacktrace do
          [unquote(top) | _] ->
            %{unquote(exception) | reason: "#{inspect unquote(module)} does not implement the Access behaviour"}
          _ ->
            unquote(exception)
        end
      reraise exception, stacktrace
    end
  end


  def fetch(list, key) when is_list(list) do
    raise ArgumentError,
          "the Access calls for keywords expect the key to be an atom, got: " <> inspect(key)
  end

  def fetch(nil, _key) do
