diff --git a/list.rkt b/list.rkt index d1186b4..6ff3472 100644 --- a/list.rkt +++ b/list.rkt @@ -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)))]) diff --git a/tests.rkt b/tests.rkt index 2536a34..168809a 100644 --- a/tests.rkt +++ b/tests.rkt @@ -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))