452 | Sprout (right1, q, right2) => |
452 | Sprout (right1, q, right2) => |
453 Sprout (make2 (left, p1, mid), p2, make2 (right1, q, right2))))) |
453 Sprout (make2 (left, p1, mid), p2, make2 (right1, q, right2))))) |
454 | modfy (Size (_, arg)) = modfy arg; |
454 | modfy (Size (_, arg)) = modfy arg; |
455 |
455 |
456 val tab' = |
456 val tab' = |
457 (case modfy tab of |
457 (case tab of |
458 Stay tab' => tab' |
458 Empty => Leaf1 (key, insert ()) |
459 | Sprout br => make2 br); |
459 | Leaf1 (k, x) => |
|
460 (case key_ord k of |
|
461 LESS => Leaf2 (key, insert (), k, x) |
|
462 | EQUAL => Leaf1 (k, update x) |
|
463 | GREATER => Leaf2 (k, x, key, insert ())) |
|
464 | Leaf2 (k1, x1, k2, x2) => |
|
465 (case key_ord k1 of |
|
466 LESS => Leaf3 (key, insert (), k1, x1, k2, x2) |
|
467 | EQUAL => Leaf2 (k1, update x1, k2, x2) |
|
468 | GREATER => |
|
469 (case key_ord k2 of |
|
470 LESS => Leaf3 (k1, x1, key, insert (), k2, x2) |
|
471 | EQUAL => Leaf2 (k1, x1, k2, update x2) |
|
472 | GREATER => Leaf3 (k1, x1, k2, x2, key, insert ()))) |
|
473 | _ => |
|
474 (case modfy tab of |
|
475 Stay tab' => tab' |
|
476 | Sprout br => make2 br)); |
460 in |
477 in |
461 make_size (size tab + !inc) tab' |
478 make_size (size tab + !inc) tab' |
462 end handle SAME => tab; |
479 end handle SAME => tab; |
463 |
480 |
464 fun update (key, x) tab = modify key (fn _ => x) tab; |
481 fun update (key, x) tab = modify key (fn _ => x) tab; |