def put.wb
bend-kit-collections@0.1.4.1 · PROOF.bend:1586
import bend-kit-collections@0.1.4.1/PROOF.bend as PROOF
import Base
import bend-mathlib@0.7.4.0/bool.bend as MBool
import bend-kit-collections@0.1.4.1/LAWS.bend as Laws
import bend-kit-collections@0.1.4.1/omap.bend as O
import bend-kit-collections@0.1.4.1/nat_order.bend as Ord
1586def put.wb(
1587 ~K: Data, ~V: Data, ~cmp: K -> K -> Cmp, t: O.OMap<K, V>, +k: K, +v: V,
1588 +wb: {WB(K, V, t) == True{} : Bool}
1589) -> {PW(K, V, W(K, V, t), Laws.g_put(~K, ~V, ~cmp, t, k, v)) == True{} : Bool}:
1590 match t:
1591 case O.OTip{}:
1592 {==}
1593 case O.OBin{+s, +key, +val, +lo, +hi}:
1594 +ok = wb.ok(K, V, key, val, lo, hi, wb)
1595 +wbl = wb.l(K, V, key, val, lo, hi, wb)
1596 +wbh = wb.h(K, V, key, val, lo, hi, wb)
1597 +n = Nat.add(W(K, V, lo), W(K, V, hi))
1598 cmp.split(O.OMap<K, V>, Bool, x => PW(K, V, n, x), True{}, cmp(k, key),
1599 u => Laws.g_balance(K, V, key, val, Laws.g_put(~K, ~V, ~cmp, lo, k, v), hi),
1600 u => O.OBin{s, key, v, lo, hi},
1601 u => Laws.g_balance(K, V, key, val, lo, Laws.g_put(~K, ~V, ~cmp, hi, k, v)),
1602 e => bal.lo(K, V, key, val, lo, Laws.g_put(~K, ~V, ~cmp, lo, k, v), hi, ok, wbh,
1603 put.wb(~K, ~V, ~cmp, lo, k, v, wbl)),
1604 e => MBool.and_eq_true(WB(K, V, O.OBin{s, key, v, lo, hi}), Ord.near(n, n), wb, Ord.nearrf.w0(n)),
1605 e => bal.hi(K, V, key, val, lo, hi, Laws.g_put(~K, ~V, ~cmp, hi, k, v), ok, wbl,
1606 put.wb(~K, ~V, ~cmp, hi, k, v, wbh)))