+
+\f
+;;; Binary search for simple vectors
+(defun binary-search (value seq &key (key #'identity))
+ (declare (simple-vector seq))
+ (labels ((recurse (start end)
+ (when (< start end)
+ (let* ((i (+ start (truncate (- end start) 2)))
+ (elt (svref seq i))
+ (key-value (funcall key elt)))
+ (cond ((< value key-value)
+ (recurse start i))
+ ((> value key-value)
+ (recurse (1+ i) end))
+ (t
+ elt))))))
+ (recurse 0 (length seq))))
+