PasteRack.org
Paste # 4979
2014-08-20 19:44:23

Fork as a new paste.

Paste viewed 173 times.


Embed:

  1. (provide insert lookup btree)
  2.  
  3. (struct Btree (tree = > <) #:transparent)
  4. (struct Empty ())
  5. (struct Node (key value size left right) #:transparent)
  6.  
  7. (define (btree = > <)
  8.   (Btree (Empty) = > <))
  9.  
  10. (define (node-size n)
  11.   (match n
  12.     [(Empty) 0]
  13.     [(Node _ _ s _ _) s]))
  14.  
  15. (define (insert-aux tree k v = > <)
  16.   (match tree
  17.     [(Node tk tvs ts tl tr)
  18.      (cond
  19.        [(= tk k) (Node tk (set-add tvs v) ts tl tr)]
  20.        [(> tk k) (let* ([new-left (insert-aux tl k v = > <)]
  21.                         [new-size (+ 1 (node-size new-left) (node-size tr))])
  22.                    (Node tk tvs new-size new-left tr))]
  23.        [(< tk k) (let* ([new-right (insert-aux tr k v = > <)]
  24.                         [new-size (+ 1 (node-size tl) (node-size new-right))])
  25.                    (Node tk tvs new-size tl new-right))])]
  26.     [(Empty) (Node k (set v) 1 (Empty) (Empty))]))
  27.  
  28. (define (insert btree k v)
  29.   (match-let ([(Btree tree = > <) btree])
  30.     (Btree (insert-aux tree k v = > <) = > <)))
  31.  
  32. (define (insert*  btree . inits)
  33.   (foldl (lambda (x m) (insert m (first x) (second x))) btree inits))
  34.  
  35.  
  36. (define (lookup-aux tree k = > <)
  37.   (match tree
  38.     [(Node tk tvs ts tl tr)
  39.      (cond
  40.        [(= tk k) tvs]
  41.        [(> tk k) (lookup-aux tl k = > <)]
  42.        [(< tk k) (lookup-aux tr k = > <)])]
  43.     [(Empty) (set)]))
  44.  
  45. (define (lookup btree k)
  46.   (match-let ([(Btree tree = > <) btree])
  47.     (lookup-aux tree k = > <)))
  48.  
  49. (define (yield-tree yield tree)
  50.   (match tree
  51.     [(Node tk tvs ts tl tr)
  52.      (yield-tree yield tl)
  53.      (yield (list tk tvs))
  54.      (yield-tree yield tr)]
  55.     [(Empty) (void)]))
  56.  
  57. (define (btree->vector bt)
  58.   (let ([i 0]
  59.         [buffer (make-vector (node-size (Btree-tree bt)))])
  60.     (yield-tree
  61.      (lambda (x)
  62.        (vector-set! buffer i x)
  63.        (set! i (add1 i))
  64.        i)
  65.      (Btree-tree bt))
  66.     buffer))
  67.  
  68. (define (btree->alist bt)
  69.   (vector->list (btree->vector bt)))
  70.  
  71. (define (alist->btree alist bt)
  72.   (match-let ([(Btree tree = > <) bt])
  73.       (foldl (lambda (pair tree)
  74.                (insert tree (car pair) (cadr pair)))
  75.              bt
  76.              alist)))
  77.  
  78. (define (partial-lookup-aux tree k = > <)
  79.   (match tree
  80.     [(Node tk tvs ts tl tr)
  81.      `(cond
  82.         [(= ,tk ,k) ,tvs]
  83.         [(> ,tk ,k) ,(partial-lookup-aux tl k = > <)]
  84.         [(< ,tk ,k) ,(partial-lookup-aux tr k = > <)])]
  85.     [(Empty) (set)]))
  86.  
  87. (define (partial-lookup btree k)
  88.   (match-let ([(Btree tree = > <) btree])
  89.     (partial-lookup-aux tree k = > <)))
  90.  
  91.  
  92. (define test-cases '((1 a) (2 b) (3 c)))
  93. (define tree1 (alist->btree test-cases (btree = > <)))
  94. (define pevald #`(lambda (x) #,(partial-lookup tree1 #'x)))
  95. (displayln pevald)
  96. (define runnable (eval pevald))
  97. (displayln (map runnable '(1 2 3)))

=>