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)))

Uses (18)

Used by (1)