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