set-queue.scm 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. (define-module (analyzer set-queue)
  2. #:use-module (srfi srfi-9)
  3. #:export (make-set-queue
  4. set-queue?
  5. set-queue-insert!
  6. set-queue-remove!
  7. set-queue-empty?
  8. emptying-set-queue!))
  9. (define-record-type set-queue-type
  10. (%make-set-queue elts)
  11. set-queue?
  12. (elts sq-elts set-sq-elts!))
  13. ;; The following are helper functions for using list-based set-queues:
  14. ;; queues where an element is only inserted if it is not already in
  15. ;; the queue.
  16. (define (make-set-queue)
  17. (%make-set-queue '()))
  18. (define (set-queue-insert! sq elt)
  19. (if (null? (sq-elts sq))
  20. (set-sq-elts! sq (list elt))
  21. (let loop ((this (sq-elts sq)))
  22. (cond ((eq? (car this) elt))
  23. ((null? (cdr this)) (set-cdr! this (list elt)))
  24. (else (loop (cdr this)))))))
  25. (define (set-queue-remove! sq)
  26. (let ((old-list (sq-elts sq)))
  27. (set-sq-elts! sq (cdr old-list))
  28. (car old-list)))
  29. (define (set-queue-empty? sq)
  30. (null? (sq-elts sq)))
  31. (define (emptying-set-queue! sq func)
  32. (if (not (set-queue-empty? sq))
  33. (let ((next (set-queue-remove! sq)))
  34. (func next)
  35. (emptying-set-queue! sq func))))