summaryrefslogtreecommitdiff
path: root/module/analyzer/set-queue.scm
diff options
context:
space:
mode:
Diffstat (limited to 'module/analyzer/set-queue.scm')
-rw-r--r--module/analyzer/set-queue.scm38
1 files changed, 38 insertions, 0 deletions
diff --git a/module/analyzer/set-queue.scm b/module/analyzer/set-queue.scm
new file mode 100644
index 000000000..89a6afa0c
--- /dev/null
+++ b/module/analyzer/set-queue.scm
@@ -0,0 +1,38 @@
+(define-module (analyzer set-queue)
+ #:export (make-set-queue
+ set-queue-insert!
+ set-queue-remove!
+ set-queue-empty?
+ emptying-set-queue!))
+
+;; The following are helper functions for using list-based set-queues:
+;; queues where an element is only inserted if it is not already in
+;; the queue.
+(define (make-set-queue)
+ (cons '() '()))
+
+(define (set-queue-insert! sq elt)
+ (cond ((null? (car sq))
+ (set-car! sq (list elt))
+ (set-cdr! sq (car sq)))
+ ((memq elt (car sq)))
+ (else
+ (let ((new-pair (list elt)))
+ (set-cdr! (cdr sq) new-pair)
+ (set-cdr! sq new-pair)))))
+
+(define (set-queue-remove! sq)
+ (let ((res (car sq)))
+ (set-car! sq (cdr (car sq)))
+ (if (eq? (cdr sq) res)
+ (set-cdr! sq '()))
+ (car res)))
+
+(define (set-queue-empty? sq)
+ (null? (car sq)))
+
+(define (emptying-set-queue! sq func)
+ (if (not (set-queue-empty? sq))
+ (let ((next (set-queue-remove! sq)))
+ (func next)
+ (emptying-set-queue! sq func))))