Annotation of researchv10no/cmd/sml/doc/examples/redblack.sml, revision 1.1.1.1

1.1       root        1: (* redblack.sml *)
                      2: 
                      3: functor RedBlack(B : sig type key
                      4:                         val > : key*key->bool
                      5:                     end):
                      6:            sig type tree
                      7:                type key
                      8:                val empty : tree
                      9:                val insert : key * tree -> tree
                     10:                val lookup : key * tree -> key
                     11:                exception Notfound of key
                     12:            end =
                     13: struct
                     14:  open B
                     15:  datatype color = RED | BLACK
                     16:  datatype tree = empty | tree of key * color * tree * tree
                     17:  exception Notfound of key
                     18: 
                     19:  fun insert (key,t) =
                     20:   let fun f empty = tree(key,RED,empty,empty)
                     21:         | f (tree(k,BLACK,l,r)) =
                     22:            if key>k
                     23:            then case f r
                     24:                 of r as tree(rk,RED, rl as tree(rlk,RED,rll,rlr),rr) =>
                     25:                        (case l
                     26:                         of tree(lk,RED,ll,lr) =>
                     27:                                tree(k,RED,tree(lk,BLACK,ll,lr),
                     28:                                           tree(rk,BLACK,rl,rr))
                     29:                          | _ => tree(rlk,BLACK,tree(k,RED,l,rll),
                     30:                                                tree(rk,RED,rlr,rr)))
                     31:                  | r as tree(rk,RED,rl, rr as tree(rrk,RED,rrl,rrr)) =>
                     32:                        (case l
                     33:                         of tree(lk,RED,ll,lr) =>
                     34:                                tree(k,RED,tree(lk,BLACK,ll,lr),
                     35:                                           tree(rk,BLACK,rl,rr))
                     36:                          | _ => tree(rk,BLACK,tree(k,RED,l,rl),rr))
                     37:                  | r => tree(k,BLACK,l,r)
                     38:            else if k>key
                     39:            then case f l
                     40:                 of l as tree(lk,RED,ll, lr as tree(lrk,RED,lrl,lrr)) =>
                     41:                        (case r
                     42:                         of tree(rk,RED,rl,rr) =>
                     43:                                tree(k,RED,tree(lk,BLACK,ll,lr),
                     44:                                           tree(rk,BLACK,rl,rr))
                     45:                          | _ => tree(lrk,BLACK,tree(lk,RED,ll,lrl),
                     46:                                                tree(k,RED,lrr,r)))
                     47:                  | l as tree(lk,RED, ll as tree(llk,RED,lll,llr), lr) =>
                     48:                        (case r
                     49:                         of tree(rk,RED,rl,rr) =>
                     50:                                tree(k,RED,tree(lk,BLACK,ll,lr),
                     51:                                           tree(rk,BLACK,rl,rr))
                     52:                          | _ => tree(lk,BLACK,ll,tree(k,RED,lr,r)))
                     53:                  | l => tree(k,BLACK,l,r)
                     54:            else tree(key,BLACK,l,r)
                     55:         | f (tree(k,RED,l,r)) =
                     56:            if key>k then tree(k,RED,l, f r)
                     57:            else if k>key then tree(k,RED, f l, r)
                     58:            else tree(key,RED,l,r)
                     59:    in case f t
                     60:       of tree(k,RED, l as tree(_,RED,_,_), r) => tree(k,BLACK,l,r)
                     61:        | tree(k,RED, l, r as tree(_,RED,_,_)) => tree(k,BLACK,l,r)
                     62:        | t => t
                     63:   end
                     64: 
                     65:  fun lookup (key,t) =
                     66:   let fun look empty = raise (Notfound key)
                     67:        | look (tree(k,_,l,r)) =
                     68:                if k>key then look l
                     69:                else if key>k then look r
                     70:                else k
                     71:    in look t
                     72:   end
                     73: 
                     74: end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.