if is_empty then return false
var res = search_down(root.as(not null), key)
if res != null then
if is_empty then return false
var res = search_down(root.as(not null), key)
if res != null then
assert not_empty: not is_empty
if cache_node != null and cache_node.key == key then return cache_node.value
var res = search_down(root.as(not null), key)
assert not_empty: not is_empty
if cache_node != null and cache_node.key == key then return cache_node.value
var res = search_down(root.as(not null), key)
var cmp = key <=> from.key
if cmp == 0 then return from
if from.left != null and cmp < 0 then
var cmp = key <=> from.key
if cmp == 0 then return from
if from.left != null and cmp < 0 then