#lang racket/base (require racket/match racket/list) (provide (all-defined-out)) (define (contiguous-group-by pred xs [equality equal?]) ;; like `group-by`, but only groups together contiguous xs with the same pred value. (let loop ([xs xs][groups null]) (match xs [(== empty equality) (reverse groups)] [(cons first-x other-xs) (define equivalence-val (pred first-x)) (define-values (group-members rest) (splitf-at other-xs (λ (x) (equal? (pred x) equivalence-val)))) (define new-group (cons first-x group-members)) ; group-members might be empty (loop rest (cons new-group groups))]))) (module+ test (require rackunit) (check-equal? (contiguous-group-by values '(1 1 2 2 2 3 4 5 5 6 6 7 8 9)) '((1 1) (2 2 2) (3) (4) (5 5) (6 6) (7) (8) (9))))