summaryrefslogtreecommitdiff
path: root/shared/queue.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'shared/queue.rkt')
-rw-r--r--shared/queue.rkt30
1 files changed, 30 insertions, 0 deletions
diff --git a/shared/queue.rkt b/shared/queue.rkt
new file mode 100644
index 0000000..4777cce
--- /dev/null
+++ b/shared/queue.rkt
@@ -0,0 +1,30 @@
+#lang racket
+
+(require compatibility/mlist)
+;; queue methods
+(define (front-ptr q) (mcar q))
+(define (rear-ptr q) (mcdr q))
+(define (set-front-ptr! q v) (set-mcar! q v))
+(define (set-rear-ptr! q v) (set-mcdr! q v))
+(define (empty-queue? q) (null? (front-ptr q)))
+(define (make-queue) (mcons '() '()))
+(define (front-queue q)
+ (if (empty-queue? q)
+ (error "FRONT called on empty queue" q)
+ (mcar (front-ptr q))))
+(define (insert-queue! q item)
+ (let ((new-item (mlist item)))
+ (cond ((empty-queue? q)
+ (set-front-ptr! q new-item)
+ (set-rear-ptr! q new-item)
+ q)
+ (else
+ (set-mcdr! (rear-ptr q) new-item)
+ (set-rear-ptr! q new-item)
+ q))))
+(define (delete-queue! q)
+ (cond ((empty-queue? q)
+ (error "DELETE! called with an empty queue" q))
+ (else
+ (set-front-ptr! q (mcdr (front-ptr q)))
+ q)))