;;; SRFI 132 specifies these eight procedures.
;;;
;;; Benchmarking has shown that the (rnrs sorting) procedures
;;; are faster than the sorting procedures defined by SRFI 132's
;;; reference implementation, so the R6RS procedures are used here.
;;;
;;; This file is a plug-and-play alternative to sort.scm in the
;;; same directory.

(define list-sort         r6rs-list-sort)
(define list-sort!        r6rs-list-sort)
(define list-stable-sort  r6rs-list-sort)
(define list-stable-sort! r6rs-list-sort)

(define (vector-sort < v . rest)
  (cond ((null? rest)
         (r6rs-vector-sort < v))
        ((null? (cdr rest))
         (r6rs-vector-sort < (r7rs-vector-copy v (car rest))))
        ((null? (cddr rest))
         (r6rs-vector-sort < (r7rs-vector-copy v (car rest) (cadr rest))))
        (else
         (error 'vector-sort
                "too many arguments"
                (cons < (cons v rest))))))

(define vector-stable-sort vector-sort)

(define (vector-sort! < v . rest)
  (cond ((null? rest)
         (r6rs-vector-sort! < v))
        ((null? (cdr rest))
         (let* ((start (car rest))
                (v2 (r7rs-vector-copy v start)))
           (r6rs-vector-sort! < v2)
           (r7rs-vector-copy! v start v2 0)))
        ((null? (cddr rest))
         (let* ((start (car rest))
                (end (cadr rest))
                (v2 (r7rs-vector-copy v start end)))
           (r6rs-vector-sort! < v2)
           (r7rs-vector-copy! v start v2 0)))
        (else
         (error 'vector-sort!
                "too many arguments"
                (cons < (cons v rest))))))

(define vector-stable-sort! vector-sort!)