;; -*- Mode: Irken -*- (include "lib/basis.scm") (define (symbol-set-class) (define (in self sym) (match (tree/member self.t < (symbol->index sym)) with (maybe:yes _) -> #t (maybe:no) -> #f )) (define (add self sym) (if (self::in sym) #u (set! self.t (tree/insert self.t < (symbol->index sym) sym)))) (define (get self) (tree/values self.t)) (define (iterate self p) (tree/inorder (lambda (k v) (p v)) self.t)) (let ((methods {in=in add=add get=get iterate=iterate})) (define (new init) (let ((r {o=methods t=(tree:empty)})) (for-each (lambda (sym) (add r sym)) init) r)) new) ) (define symbol-set-maker (symbol-set-class)) (let ((s (symbol-set-maker '(a b c d)))) (s::add 'e) (printn (s::get)))