Ordered keyed collection used by Solve collection sources, dependencies, and lookups.
@type id() :: term()
@type t(item) :: %Solve.Collection{ids: [id()], items: %{required(id()) => item}}
@spec delete(t(item), id()) :: t(item)
@spec empty() :: t(any())
@spec fetch(t(item), id()) :: {:ok, item} | :error when item: var
@spec get(t(item), id()) :: item | nil when item: var
@spec put(t(item), id(), item) :: t(item) when item: var
@spec reorder(t(item), [id()]) :: t(item)
@spec to_list(t(item)) :: [{id(), item}] when item: var