   """
   @callback get_and_update(data, key, (value | nil -> {current_value, new_value :: value} | :pop)) ::
               {current_value, new_data :: data}
-            when current_value: value, data: container | any_container
+            when current_value: value, data: container
 
   @doc """
   Invoked to "pop" the value under `key` out of the given data structure.


  See the implementations for `Map.pop/3` or `Keyword.pop/3` for more examples.
  """
  @callback pop(data, key) :: {value, data} when data: container | any_container

  defmacrop raise_undefined_behaviour(exception, module, top) do
    quote do


  @type container :: keyword | struct | map
  @type nil_container :: nil
  @type t :: container | nil_container | any
  @type key :: any
  @type value :: any

