; matrix search

(define (bsearch lt? x xs)
  (let loop ((lo 0) (hi (- (vector-length xs) 1)) (result #f))
    (let ((mid (+ lo (quotient (- hi lo) 2))))
      (cond ((< hi lo) result)
            ((lt? x (vector-ref xs mid)) (loop lo (- mid 1) result))
            ((lt? (vector-ref xs mid) x) (loop (+ mid 1) hi result))
            (else (loop lo (- mid 1) mid))))))

(define (vector-row r mat) (vector-ref mat r))

(define (matsearch lt? x mat)
  (let ((len (vector-length mat)))
    (let loop ((r 0))
      (cond ((= r (vector-length mat)) #f)
            ((bsearch lt? x (vector-row r mat)) =>
              (lambda (c) (list r c)))
            (else (loop (+ r 1)))))))

(define mat '#(#(2 5 8) #(1 4 7) #(3 6 9)))
(display (matsearch < 8 mat)) (newline)
(display (matsearch < 6 mat)) (newline)
(display (matsearch < 0 mat)) (newline)