; sorting without duplicates, revisited

(define (split-while pred? xs)
  (let loop ((xs xs) (ys '()))
    (if (or (null? xs) (not (pred? (car xs))))
        (values (reverse ys) xs)
        (loop (cdr xs) (cons (car xs) ys)))))

(define (group-by pred? xs)
  (let loop ((xs xs) (zss (list)))
    (if (null? xs) (reverse zss)
      (call-with-values
        (lambda () (split-while (lambda (x) (pred? x (car xs))) xs))
        (lambda (head tail) (loop tail (cons head zss)))))))

(define (transpose xss)
  (if (null? xss) (list)
    (cons (map car xss) (transpose (filter pair? (map cdr xss))))))

(define (sort-no-dups xs)
  (apply append (transpose (group-by = (sort xs <)))))

(display (sort-no-dups '(2 9 1 5 1 4 9 7 2 1 4))) (newline)