From 3d6b75699ad4339b7981db29ad2dc535b350fc04 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Wed, 13 May 2015 13:16:09 -0700 Subject: [PATCH] strengthen typing on `shift` --- typed/sugar/list.rkt | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/typed/sugar/list.rkt b/typed/sugar/list.rkt index d0115d0..41b3142 100644 --- a/typed/sugar/list.rkt +++ b/typed/sugar/list.rkt @@ -17,7 +17,7 @@ (for/fold: ([current-list : (Listof A) empty] [list-of-lists : (Listof (Listof A)) empty] [negating? : Boolean #f]) - ([x (in-list xs)]) + ([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?) @@ -37,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) @@ -55,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)))) @@ -74,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)))) @@ -87,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) @@ -166,25 +166,25 @@ (define/typed+provide shift - (case-> ((Listof Any) (U Integer (Listof Integer)) -> (Listof Any)) - ((Listof Any) (U Integer (Listof Integer)) Any -> (Listof Any)) - ((Listof Any) (U Integer (Listof Integer)) Any Boolean -> (Listof Any))) + (All (A) (case-> ((Listof (Option A)) (U Integer (Listof Integer)) -> (U (Listof (Option A)) (Listof (Listof (Option A))))) + ((Listof (Option A)) (U Integer (Listof Integer)) (Option A) -> (U (Listof (Option A)) (Listof (Listof (Option A))))) + ((Listof (Option A)) (U Integer (Listof Integer)) (Option A) Boolean -> (U (Listof (Option A)) (Listof (Listof (Option A))))))) (case-lambda [(xs shift-amount-or-amounts) (shift xs shift-amount-or-amounts #f #f)] [(xs shift-amount-or-amounts fill-item) (shift xs shift-amount-or-amounts fill-item #f)] [(xs shift-amount-or-amounts fill-item cycle) - (define/typed (do-shift xs how-far) - ((Listof Any) Integer -> (Listof Any)) + (define/typed (do-shift xs fill-item how-far) + (All (A2) ((Listof (Option A2)) (Option A2) Integer -> (Listof (Option A2)))) (define abs-how-far (abs how-far)) (cond [(> abs-how-far (length xs)) (error 'shift "index is too large for list\nindex: ~a\nlist: ~v" how-far xs)] [(= how-far 0) xs] [(positive? how-far) - (append (make-list abs-how-far fill-item) (drop-right xs abs-how-far))] + ((inst append (Option A2)) ((inst make-list (Option A2)) abs-how-far fill-item) (drop-right xs abs-how-far))] ;; otherwise how-far is negative [else (append (drop xs abs-how-far) (make-list abs-how-far fill-item))])) (if (list? shift-amount-or-amounts) - (map (λ:([amount : Integer]) (do-shift xs amount)) shift-amount-or-amounts) - (do-shift xs shift-amount-or-amounts))])) + ((inst map (Listof (Option A)) Integer) (λ:([amount : Integer]) (do-shift xs fill-item amount)) shift-amount-or-amounts) + (do-shift xs fill-item shift-amount-or-amounts))]))