;; -*- Mode: Irken -*- (define (map-class) (define (add self k v) (match (tree/member self.t self.cmp k) with (maybe:yes _) -> (error1 "key already present in map" k) (maybe:no) -> (set! self.t (tree/insert self.t self.cmp k v)))) (define (lookup self k) (tree/member self.t self.cmp k)) (define (lookup* self k default) (match (tree/member self.t self.cmp k) with (maybe:yes v) -> v (maybe:no) -> default)) (define (get-error self k errstring) (match (tree/member self.t self.cmp k) with (maybe:yes v) -> v (maybe:no) -> (error1 errstring k))) (define (iterate self p) (tree/inorder p self.t)) (define (map self p) (let ((r '())) (tree/reverse (lambda (k v) (PUSH r (p k v))) self.t) r)) (define (keys self) (tree/keys self.t)) (define (values self) (tree/values self.t)) (let ((methods {add=add get=lookup get-default=lookup* get-err=get-error iterate=iterate map=map keys=keys values=values})) ;; new method (lambda (cmp) ;; don't modify the cmp function slot, you dolt. {o=methods t=(tree/empty) cmp=cmp} ))) (define map-maker (map-class))