You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
20 lines
806 B
Racket
20 lines
806 B
Racket
#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)))) |