diff --git a/sugar/test/main.rkt b/sugar/test/main.rkt index ab934f4..2148de2 100644 --- a/sugar/test/main.rkt +++ b/sugar/test/main.rkt @@ -141,8 +141,8 @@ (check-equal? (slice-at (range 5) 3) '((0 1 2) (3 4))) (check-equal? (slice-at (range 5) 3 #t) '((0 1 2))) - (check-equal? (slicef '(1 2 2 1 1 1 2) odd?) '((1) (2 2) (1 1 1) (2))) - (check-equal? (slicef '(1 2 2 1 1 1 2) even?) (slicef '(1 2 2 1 1 1 2) odd?)) + (check-equal? (slicef '(0 1 2 0 0 0 3) positive?) '((0) (1 2) (0 0 0) (3))) + (check-equal? (slicef '(0 1 2 0 0 0 3) positive?) (slicef '(0 1 2 0 0 0 3) zero?)) (check-equal? (slicef '(1 (1) (1) 1 1 1 (1)) list?) '((1) ((1) (1)) (1 1 1) ((1)))) (check-equal? (slicef '(1 2 3 4 5) list?) '((1 2 3 4 5))) diff --git a/typed/sugar/list.rkt b/typed/sugar/list.rkt index a5de3bb..d0115d0 100644 --- a/typed/sugar/list.rkt +++ b/typed/sugar/list.rkt @@ -13,11 +13,19 @@ (define/typed+provide (slicef xs pred) (All (A) ((Listof A) (A -> Boolean) -> (Listof (Listof A)))) - (let loop ([xs xs][acc : (Listof (Listof A)) empty]) - (if (empty? xs) - (reverse acc) - (let-values ([(cdr-matches rest) (splitf-at (cdr xs) (if (pred (car xs)) pred (λ([x : A]) (not (pred x)))))]) - (loop rest (cons (cons (car xs) cdr-matches) acc)))))) + (define-values (last-list list-of-lists last-negating) + (for/fold: ([current-list : (Listof A) empty] + [list-of-lists : (Listof (Listof A)) empty] + [negating? : Boolean #f]) + ([x (in-list xs)]) + (define current-pred (if negating? (λ: ([x : A]) (not (pred x))) pred)) + (if (current-pred x) + (values (cons x current-list) list-of-lists negating?) + (values (cons x null) (if (not (empty? current-list)) + (cons (reverse current-list) list-of-lists) + list-of-lists) (not negating?))))) + (reverse (cons (reverse last-list) list-of-lists))) + (define/typed+provide slicef-at ;; with polymorphic function, use cased typing to simulate optional position arguments @@ -29,8 +37,8 @@ [(xs pred force?) (define-values (last-list list-of-lists) (for/fold: - ([current-list : (Listof A) empty][list-of-lists : (Listof (Listof A)) empty]) - ([x (in-list xs)]) + ([current-list : (Listof A) empty][list-of-lists : (Listof (Listof A)) empty]) + ([x (in-list xs)]) (if (pred x) (values (cons x null) (if (not (empty? current-list)) (cons (reverse current-list) list-of-lists) @@ -47,7 +55,7 @@ (All (A) ((Listof A) (A -> Boolean) -> (Listof (Listof A)))) (define-values (last-list list-of-lists) (for/fold: ([current-list : (Listof A) empty][list-of-lists : (Listof (Listof A)) empty]) - ([x (in-list xs)]) + ([x (in-list xs)]) (if (pred x) (values empty (cons (reverse (cons x current-list)) list-of-lists)) (values (cons x current-list) list-of-lists)))) @@ -66,7 +74,7 @@ [(xs len force?) (define-values (last-list list-of-lists) (for/fold: ([current-list : (Listof A) empty][list-of-lists : (Listof (Listof A)) empty]) - ([x (in-list xs)][i (in-naturals)]) + ([x (in-list xs)][i (in-naturals)]) (if (= (modulo (add1 i) len) 0) (values empty (cons (reverse (cons x current-list)) list-of-lists)) (values (cons x current-list) list-of-lists)))) @@ -79,7 +87,7 @@ (All (A) ((Listof A) (A -> Boolean) -> (Listof (Listof A)))) (define-values (last-list list-of-lists) (for/fold: ([current-list : (Listof A) empty][list-of-lists : (Listof (Listof A)) empty]) - ([x (in-list xs)]) + ([x (in-list xs)]) (if (pred x) (values empty (if (not (empty? current-list)) (cons (reverse current-list) list-of-lists)