(SEMANTIC CHANGE) update-objects-joins now simpler and more predicatble
[clsql.git] / sql / utils.lisp
index 12d5d286b5024116360e92a9319adc688a7136db..3162a7d8a242e1fc3da6577fdfc136fdd5c60c27 100644 (file)
     ,@(loop for (place value . rest) on place-value-plist by #'cddr
             collect `(unless ,place (setf ,place ,value)))))
 
+(defmacro pop-n (place &optional (n 1))
+  "pops n items off of a list in place and returns their values in a new list
+
+   if n > the length of the list in place, then we return the full list,
+     setting the place to nil"
+  `(loop repeat ,n
+    while ,place
+    collect (pop ,place)))
+
 (defun %get-int (v)
   (etypecase v
     (string (parse-integer v :junk-allowed t))
@@ -455,6 +464,12 @@ removed. keys are searched with #'MEMBER"
     (symbol (find-class it))
     (standard-object (class-of it))))
 
+(defun to-class-name (o)
+  (etypecase o
+    (symbol o)
+    (standard-class (class-name o))
+    (standard-object (class-name (class-of o)))))
+
 (defun easy-slot-value (obj slot)
   "like slot-value except it accepts slot-names or defs
    and returns nil when the slot is unbound"
@@ -466,3 +481,8 @@ removed. keys are searched with #'MEMBER"
   "like slot-value except it accepts slot-names or defs"
   (setf (slot-value obj (to-slot-name slot)) new))
 
+(defun delist-if-single (x)
+  "if this is a single item in a list return it"
+  (if (and (listp x) (= 1 (length x)))
+      (first x)
+      x))