diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env.rkt index 0ff686230f..4920c15a9e 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/base-env/base-env.rkt @@ -614,11 +614,43 @@ [last-pair (-poly (a) ((-mu x (Un a (-val '()) (-pair a x))) . -> . (Un (-pair a a) (-pair a (-val '())))))] +[takef + (-poly (a b) + (cl->* + (-> (-lst a) + (asym-pred a Univ (-FS (-filter b 0) -top)) + (-lst b)) + (-> (-lst a) (-> a Univ) (-lst a))))] +[dropf (-poly (a) (-> (-lst a) (-> a Univ) (-lst a)))] +[splitf-at + (-poly (a b) + (cl->* + (-> (-lst a) + (asym-pred a Univ (-FS (-filter b 0) -top)) + (-values (list (-lst b) (-lst a)))) + (-> (-lst a) (-> a Univ) (-values (list (-lst a) (-lst a))))))] +[takef-right + (-poly (a b) + (cl->* + (-> (-lst a) + (asym-pred a Univ (-FS (-filter b 0) -top)) + (-lst b)) + (-> (-lst a) (-> a Univ) (-lst a))))] +[dropf-right (-poly (a) (-> (-lst a) (-> a Univ) (-lst a)))] +[splitf-at-right + (-poly (a b) + (cl->* + (-> (-lst a) + (asym-pred a Univ (-FS (-filter b 0) -top)) + (-values (list (-lst a) (-lst b)))) + (-> (-lst a) (-> a Univ) (-values (list (-lst a) (-lst a))))))] [append-map (-polydots (c a b) ((list ((list a) (b b) . ->... . (-lst c)) (-lst a)) ((-lst b) b) . ->... .(-lst c)))] [append* (-poly (a) ((-lst (-lst a)) . -> . (-lst a)))] +[permutations (-poly (a) (-> (-lst a) (-lst (-lst a))))] +[in-permutations (-poly (a) (-> (-lst a) (-seq (-lst a))))] [argmin (-poly (a) ((a . -> . -Real) (-lst a) . -> . a))] [argmax (-poly (a) ((a . -> . -Real) (-lst a) . -> . a))] diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt index 5b2eff0970..78fc3eddc9 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/typecheck-tests.rkt @@ -2086,6 +2086,22 @@ [tc-e (remq* '(1 2) '(a b c d)) (-lst (one-of/c 'a 'b 'c 'd))] [tc-e (remv* '(1 2) '(a b c d)) (-lst (one-of/c 'a 'b 'c 'd))] + ;; functions from racket/list + [tc-e (takef '(a b "x" "y") symbol?) (-lst -Symbol)] + [tc-e (takef-right '(a b "x" "y") string?) (-lst -String)] + [tc-e (dropf '("a" b "x" "y") string?) + (-lst (t:Un -String (-val 'b)))] + [tc-e (dropf-right '("a" b "x" "y") string?) + (-lst (t:Un -String (-val 'b)))] + [tc-e (splitf-at '("a" b "x" "y") string?) + #:ret (ret (list (-lst -String) + (-lst (t:Un -String (-val 'b)))))] + [tc-e (splitf-at-right '("a" b "x" "y") string?) + #:ret (ret (list (-lst (t:Un -String (-val 'b))) + (-lst -String)))] + [tc-e (permutations '(a b c d)) (-lst (-lst (one-of/c 'a 'b 'c 'd)))] + [tc-e (in-permutations '(a b c d)) (-seq (-lst (one-of/c 'a 'b 'c 'd)))] + ;; test functions which do lookup with the "wrong type", where the ;; result type shouldn't be widened to include that type [tc-e (memq 3 '(a b c)) (t:Un (-val #f) (-lst (one-of/c 'a 'b 'c)))]