fix for `slicef-at`

pull/2/head
Matthew Butterick 10 years ago
parent 0a6db2e350
commit dc2b29c758

@ -11,13 +11,14 @@
(define+provide/contract (slicef-at xs pred [force? #f])
((list? procedure?) (boolean?) . ->* . list-of-lists?)
(define-values (last-list list-of-lists)
(for/fold ([current-list empty][list-of-lists empty])([x (in-list xs)])
(if (pred x)
(define-values (last-list list-of-lists _)
(for/fold ([current-list empty][list-of-lists empty][previous-x-was-pred #f])([x (in-list xs)])
(define pred-x (pred x))
(if (and (not previous-x-was-pred) pred-x)
(values (cons x null) (if (not (empty? current-list))
(cons (reverse current-list) list-of-lists)
list-of-lists))
(values (cons x current-list) list-of-lists))))
list-of-lists) pred-x)
(values (cons x current-list) list-of-lists pred-x))))
(let ([list-of-lists (reverse (if (empty? last-list)
list-of-lists
(cons (reverse last-list) list-of-lists)))])

@ -157,6 +157,7 @@
(check-equal? (slicef-at (range 5) procedure?) '((0 1 2 3 4)))
(check-exn exn:fail:contract? (λ() (slicef-at (range 5) 3)))
(check-equal? (slicef-at '(1 2) integer?) '((1 2)))
(check-equal? (sublist (range 5) 0 0) '())
(check-equal? (sublist (range 5) 0 1) '(0))

Loading…
Cancel
Save