(define (group-by xs f)
(reverse (foldl (lambda (x l)
(let ((val (cdr x)))
(if (null? l)
(list (list val))
(let ((prev (caar l)))
(if (= prev val)
(cons (append (car l) (list val)) (cdr l))
(cons (list val) l))))))
'()
(sort (map (lambda (x) (cons x (f x))) xs) (lambda (x y) (< (cdr x) (cdr y)))))))
(define f (lambda(x) (/ 1 x)))
(group-by (list 2 5 4 5 8 2 8) f)
KGRlZmluZSAoZ3JvdXAtYnkgeHMgZikKICAocmV2ZXJzZSAoZm9sZGwgKGxhbWJkYSAoeCBsKQogICAgICAgICAgICAgICAgICAgIChsZXQgKCh2YWwgIChjZHIgeCkpKQogICAgICAgICAgICAgICAgICAgICAgKGlmIChudWxsPyBsKQogICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IChsaXN0IHZhbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHByZXYgKGNhYXIgbCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmICg9IHByZXYgdmFsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIChhcHBlbmQgKGNhciBsKSAobGlzdCB2YWwpKSAoY2RyIGwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIChsaXN0IHZhbCkgbCkpKSkpKQogICAgICAgICAgICAgICAgICAnKCkKICAgICAgICAgICAgICAgICAgKHNvcnQgKG1hcCAobGFtYmRhICh4KSAoY29ucyB4IChmIHgpKSkgeHMpIChsYW1iZGEgKHggeSkgKDwgKGNkciB4KSAoY2RyIHkpKSkpKSkpCgooZGVmaW5lIGYgKGxhbWJkYSh4KSAoLyAxIHgpKSkKKGdyb3VwLWJ5IChsaXN0IDIgNSA0IDUgOCAyIDgpIGYp