;; -*- 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)))