lib/type_check/default_overrides/access.ex

defmodule TypeCheck.DefaultOverrides.Access do
  use TypeCheck

  @type! access_fun(data, current_value) ::
           get_fun(data) | get_and_update_fun(data, current_value)

  @type! any_container() :: any()

  @type! container() :: keyword() | struct() | map()

  @type! get_and_update_fun(data, current_value) ::
           (:get_and_update, data, (term() -> term()) ->
              {current_value, new_data :: container()} | :pop)

  @type! get_fun(data) ::
           (:get, data, (term() -> term()) -> new_data :: container())

  @type! key() :: any()

  @type! nil_container() :: nil

  @type! t() :: container() | nil_container() | any_container()

  @type! value() :: any()
end