let dequeue_with_key t =
    match Doubly_linked.remove_first t.queue with
    | None -> None
    | Some kv -> Table.remove t.table kv.key; Some (kv.key, kv.value)