; self-organizing lists

(define (box v) (vector v))
(define (unbox box) (vector-ref box 0))
(define (box! box v) (vector-set! box 0 v))

(define (set-create) (box (list)))

(define (set-member? x xs)
  (let loop ((front (list)) (back (unbox xs)))
    (cond ((null? back) #f)
          ((equal? x (car back))
            (box! xs (append (list (car back))
                             (reverse front)
                             (cdr back)))
            #t)
          (else (loop (cons (car back) front)
                      (cdr back))))))

(define (set-insert! x xs)
  (if (not (set-member? x xs))
      (box! xs (cons x (unbox xs))))
  xs)

(define (set-delete! x xs)
  (if (set-member? x xs)
      (box! xs (cdr (unbox xs))))
  xs)

(define xs (set-create))
(display (set-insert! 1 xs)) (newline)
(display (set-insert! 2 xs)) (newline)
(display (set-insert! 3 xs)) (newline)
(display (set-member? 1 xs)) (newline)
(display xs) (newline)
(display (set-delete! 2 xs)) (newline)
(display (set-delete! 1 xs)) (newline)
(display (set-delete! 3 xs)) (newline)
(display (set-member? 1 xs)) (newline)