   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

  end

  defp at(_op, data, _index, _next) do
    raise "Access.at/1 expected a list, got: #{inspect data}"
  end

  defp get_and_update_at([head | rest], 0, next, updates) do

  end

  defp filter(_op, data, _func, _next) do
    raise "Access.filter/1 expected a list, got: #{inspect(data)}"
  end

  defp get_and_update_filter([head | rest], func, next, updates, gets) do
