src/Pure/General/table.ML
changeset 77882 bb7238e7d2d9
parent 77881 560bdb9f2101
child 77973 ab6e4085a19d
equal deleted inserted replaced
77881:560bdb9f2101 77882:bb7238e7d2d9
   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;