From d4a82f6c7e4d4bd1978f4071aab494271db73e54 Mon Sep 17 00:00:00 2001 From: Colin Okay Date: Sun, 27 Feb 2022 10:58:36 -0600 Subject: deletion endpoint, newest endpoint, queue implementation --- src/util.lisp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/util.lisp') diff --git a/src/util.lisp b/src/util.lisp index 2fc079b..ad312eb 100644 --- a/src/util.lisp +++ b/src/util.lisp @@ -18,3 +18,43 @@ :key #'symbol-name))) ,@body)))) + +(defclass queue-buffer () + ((front :initform (list)) + (back :initform (list)) + (size :initform 0) + (capacity :initarg capacity))) + +(defun make-qb (capacity) + (make-instance 'queue-buffer :capacity capacity)) + +(defun qb-empty-p (q) + (zerop (slot-value q 'size))) + +(defun qb-full-p (q) + (= (slot-value q 'size) (slot-value q 'capacity))) + +(defun enqueue-qb (q x) + (when (qb-full-p q) (dequeue-qb q)) + (with-slots (size back) q + (push x back) + (incf size))) + +(defun dequeue-qb (q &optional default) + (with-slots (front back size) q + (cond + ((plusp size) + (when (null front) + (setf front (nreverse back) + back nil)) + (decf size) + (pop front)) + + (t default)))) + +(defun qb-look (q) + "get a list of the queue, but don't remove items from it" + (with-slots (front back) q + (nconc (copy-seq front) + (reverse back)))) + -- cgit v1.2.3