; one-swappable array

(define (swappable? xs)
  (define (x i) (vector-ref xs i))
  (define (swap! i j)
    (let ((t (vector-ref xs i)))
      (vector-set! xs i
        (vector-ref xs j))
      (vector-set! xs j t)))
  (define (sorted? i j)
    (cond ((= i j) #t)
          ((not (< (x i) (x (+ i 1)))) #f)
          (else (sorted? (+ i 1) j))))
  (let* ((len (vector-length xs))
         (left (let loop ((i 0))
                 (if (= i (- len 1)) #f
                   (if (< (x (+ i 1)) (x i)) i
                     (loop (+ i 1))))))
         (right (let loop ((j (- len 1)))
                  (if (= j 1) #f
                    (if (< (x j) (x (- j 1))) j
                      (loop (- j 1)))))))
    (if (not (and left right)) #f
      (begin
        (swap! left right)
        (if (sorted? (max (- left 1) 0)
                     (min (+ right 1) (- len 1)))
            (list left right)
            #f)))))

(display (swappable? '#(1 2 6 4 5 3 7))) (newline)
(display (swappable? '#(7 6 5 4 3 2 1))) (newline)
(display (swappable? '#(1 2 3 4 5 6 7))) (newline)
(display (swappable? '#(7 2 3 4 5 6 1))) (newline)
(display (swappable? '#(1 2 4 3 5 6 7))) (newline)
(display (swappable? '#(2 7 3 4 5 1 6))) (newline)