def h.gp_same

bend-kit-collections@0.1.4.1 · PROOF.bend:2984

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/hmap.bend as M

2984def h.gp_same(
2985  ~K: Data, ~V: Data, ~hash: K -> U32, ~eq: K -> K -> Bool, ~refl: @x: K -> {eq(x, x) == True{} : Bool},
2986  n: Nat, +mask: U32, m: M.HMap<K, V>, +hk: U32, +k: K, +v: V,
2987  +ob: {h.onebit(mask) == True{} : Bool}, +wf: {h.WF(~K, ~V, ~hash, ~eq, n, m) == True{} : Bool}
2988) -> {h.G(~K, ~V, ~eq, n, mask, h.P(~K, ~V, ~eq, n, mask, m, hk, k, v), hk, k) == Some{v} : Maybe<&2, V>}:
2989  match n:
2990    case 0n:
2991      match m:
2992        case M.HNil{}:
2993          h.eg_put_same(~K, ~V, ~eq, ~refl, Nil{}, k, v)
2994        case M.HLeaf{o, es}:
2995          h.eg_put_same(~K, ~V, ~eq, ~refl, es, k, v)
2996        case M.HBranch{lo, hi}:
2997          Empty.absurd({h.G(~K, ~V, ~eq, 0n, mask, M.HBranch{lo, hi}, hk, k) == Some{v} : Maybe<&2, V>}, MBool.false_ne_true()(wf))
2998    case 1n+(+p):
2999      match m:
3000        case M.HNil{}:
3001          %h.g_lf_t(~K, ~V, ~eq, p, mask, hk, [M.Entry{k, v}], hk, k, h.u_refl(hk)) : {_ == Some{v} : Maybe<&2, V>}
3002          h.eg_put_same(~K, ~V, ~eq, ~refl, Nil{}, k, v)
3003        case M.HLeaf{+o, +es}:
3004          h.gp_same.lf(~K, ~V, ~eq, ~refl, p, mask, o, es, hk, k, v, U32.is_eq(o, hk), {==},
3005            h.split_same(~K, ~V, ~eq, ~refl, 1n+p, mask, o, es, hk, k, v, ob))
3006        case M.HBranch{+lo, +hi}:
3007          h.gp_same.br(~K, ~V, ~eq, p, mask, lo, hi, hk, k, v, U32.is_eq((hk .&. mask : U32), 0), {==},
3008            h.gp_same(~K, ~V, ~hash, ~eq, ~refl, p, (mask << 1n : U32), lo, hk, k, v, h.onebit_shl(mask, ob),
3009              MBool.eq_true_of_and_left(h.WF(~K, ~V, ~hash, ~eq, p, lo), h.WF(~K, ~V, ~hash, ~eq, p, hi), wf)),
3010            h.gp_same(~K, ~V, ~hash, ~eq, ~refl, p, (mask << 1n : U32), hi, hk, k, v, h.onebit_shl(mask, ob),
3011              MBool.eq_true_of_and_right(h.WF(~K, ~V, ~hash, ~eq, p, lo), h.WF(~K, ~V, ~hash, ~eq, p, hi), wf)))

Uses (25)

Used by (2)