[funds-cvs] r193 - trunk/funds/src

abaine at common-lisp.net abaine at common-lisp.net
Mon Aug 20 16:30:56 UTC 2007


Author: abaine
Date: Mon Aug 20 12:30:56 2007
New Revision: 193

Modified:
   trunk/funds/src/package.lisp
   trunk/funds/src/queue.lisp
Log:
Substituted alternative version of queue using CLOS; I had been developing this in parallel and it makes more sense, I thirk.

Modified: trunk/funds/src/package.lisp
==============================================================================
--- trunk/funds/src/package.lisp	(original)
+++ trunk/funds/src/package.lisp	Mon Aug 20 12:30:56 2007
@@ -49,7 +49,8 @@
 	   :queue-first
 	   :queue-size
 	   :queue-as-list
-	   :queue-from-list
+	   :queue-count
+	   :queue-count-if
 	   :map-queue
 
 	   :make-stack
@@ -59,6 +60,8 @@
 	   :stack-size
 	   :stack-from-list
 	   :stack-as-list
+	   :stack-count
+	   :stack-count-if
 	   :map-stack
 
 	   :make-dictionary

Modified: trunk/funds/src/queue.lisp
==============================================================================
--- trunk/funds/src/queue.lisp	(original)
+++ trunk/funds/src/queue.lisp	Mon Aug 20 12:30:56 2007
@@ -17,10 +17,19 @@
 
 (in-package :funds)
 
-(defstruct queue
-  "A FIFO queue."
-  (next-priority 0)
-  (heap (make-heap)))
+(defclass queue ()
+  ((next-priority :initarg :next-priority
+		  :initform 0
+		  :reader queue-next-priority)
+   (heap :initarg :heap
+	 :initform (make-heap)
+	 :reader queue-heap)))
+
+(defun make-queue (&key (initial-contents nil))
+  (reduce #'(lambda (q n)
+	      (enqueue q n))
+	  initial-contents
+	  :initial-value (make-instance 'queue)))
 
 (defun queue-first (q)
   "The value at the head of the given queue."
@@ -28,15 +37,15 @@
 
 (defun enqueue (q item)
   "The queue that results when the given item is equeued on the given queue."
-  (make-queue :next-priority (1+ (queue-next-priority q))
-	      :heap (heap-insert (queue-heap q) item (queue-next-priority q))))
+  (make-instance 'queue :next-priority (1+ (queue-next-priority q))
+		 :heap (heap-insert (queue-heap q) item (queue-next-priority q))))
 
 (defun dequeue (q)
   "The queue that results when the first item is removed from the given queue."
   (if (queue-empty-p q)
       q
-      (make-queue :next-priority (1- (queue-next-priority q))
-		  :heap (heap-remove (queue-heap q)))))
+      (make-instance 'queue  :next-priority (1- (queue-next-priority q))
+		     :heap (heap-remove (queue-heap q)))))
 
 (defun queue-size (q)
   "The number of items in the given queue."
@@ -49,8 +58,8 @@
 (defun map-queue (function q)
   "A queue containing items that are the result of applying function to
 the items in the given queue."
-  (make-queue :next-priority (queue-next-priority q)
-	      :heap (map-tree #'(lambda (tree)
+  (make-instance 'queue :next-priority (queue-next-priority q)
+		 :heap (map-tree #'(lambda (tree)
 				  (funcall function (bt-value tree)))
 			      (queue-heap q))))
 
@@ -60,9 +69,13 @@
   (mapcar #'cdr (sort (tree-as-alist (queue-heap q))
 		      #'< :key #'car)))
 
-(defun queue-from-list (list)
-  "A queue whose elements are in the same order as the given list."
-  (reduce #'(lambda (q n)
-	      (enqueue q n))
-	  list 
-	  :initial-value (make-queue)))
+(defun queue-count (item q &key (key #'identity) (test #'eql))
+  (tree-count item (queue-heap q) 
+	      :key #'(lambda (tree)
+		       (funcall key (bt-value tree)))
+	      :test test))
+
+(defun queue-count-if (predicate q &key (key #'identity))
+  (tree-count-if predicate (queue-heap q)
+		 :key #'(lambda (tree)
+			  (funcall key (bt-value tree)))))



More information about the Funds-cvs mailing list