A little BTree.

Persistent (immutable) datastructure.
This commit is contained in:
sforman 2023-10-20 19:36:41 -07:00
parent b116c2c98b
commit 0fcd217f2c
2 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,62 @@
(import srfi-1)
(import srfi-12)
(import matchable)
; Importing srfi-67 did not actually make available symbol-compare. Boo!
(define (symbol<? a b) (string<? (symbol->string a) (symbol->string b)))
; a BTree is a four-tuple of (name value left right) | ()
(define (btree-get key btree)
(match btree
(() (abort "Key not found."))
((k value left right)
(if (eq? key k)
value
(btree-get key (if (symbol<? key k) left right))))
(_ (abort "Not a BTree."))))
(define (btree-insert key value btree)
(match btree
(() (list key value '() '()))
((k v left right)
(if (eq? key k)
(list k value left right)
(if (symbol<? key k)
(list k v (btree-insert key value left) right)
(list k v left (btree-insert key value right)))))
(_ (abort "Not a BTree."))))
(set! T '())
(set! T (btree-insert 'larry 23 T))
(set! T (btree-insert 'barry 18 T))
(set! T (btree-insert 'carry 99 T))
(display T)
(newline)
(define (balance el)
(if (null-list? el)
el
(balance0 el (halve (length el)))))
(define (balance0 el midpoint)
(receive (prefix suffix) (split-at el midpoint)
(cons
(first suffix)
(append
(balance prefix)
(balance (cdr suffix))))))
(define (halve n) (quotient n 2))
(set! T (iota 23))
;(define (btree-sorted-list items)
; (btree-sorted-list0 items (length items)))
;(define (btree-sorted-list items len)
; ())

View File

@ -26,6 +26,7 @@
(import (chicken io)) (import (chicken io))
(import (chicken string)) (import (chicken string))
(import srfi-1)
(import srfi-12) (import srfi-12)
(import srfi-69) (import srfi-69)
(import matchable) (import matchable)
@ -274,3 +275,21 @@
;(display (doit "1 2 true [4 5 false] loop <")) ;(display (doit "1 2 true [4 5 false] loop <"))
;(newline) ;(newline)
; Importing srfi-67 did not actually make available symbol-compare. Boo!
(define (symbol<? a b) (string<? (symbol->string a) (symbol->string b)))
; a BTree is a four-tuple of (name value left right) | ()
(define (btree-get key btree)
(match btree
(() (abort "Key not found."))
((k value left right)
(if (eq? key k)
value
(btree-get key (if (symbol<? key k) left right))))
(_ (abort "Not a BTree."))))