From 9738e6977c9bf75e2dbab17789131ffb2dbb07b4 Mon Sep 17 00:00:00 2001 From: Jack Firth Date: Fri, 30 Aug 2024 17:03:05 -0700 Subject: [PATCH] Add some `hash-map` shortcuts (#250) --- .../hash-shortcuts-test.rkt | 22 +++++++++++++++++++ default-recommendations/hash-shortcuts.rkt | 20 ++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/default-recommendations/hash-shortcuts-test.rkt b/default-recommendations/hash-shortcuts-test.rkt index fe02b1e..d976538 100644 --- a/default-recommendations/hash-shortcuts-test.rkt +++ b/default-recommendations/hash-shortcuts-test.rkt @@ -154,3 +154,25 @@ test: "hash-set! with hash-ref cannot be simplified when v would shadow" (define v 5) (hash-set! h k (+ v (hash-ref h k 0))) ------------------------------ + + +test: "hash-map with key-returning lamda can be refactored to hash-keys" +------------------------------ +(define h (make-hash)) +(hash-map h (λ (k v) k)) +------------------------------ +------------------------------ +(define h (make-hash)) +(hash-keys h) +------------------------------ + + +test: "hash-map with value-returning lamda can be refactored to hash-values" +------------------------------ +(define h (make-hash)) +(hash-map h (λ (k v) v)) +------------------------------ +------------------------------ +(define h (make-hash)) +(hash-values h) +------------------------------ diff --git a/default-recommendations/hash-shortcuts.rkt b/default-recommendations/hash-shortcuts.rkt index dd86b62..fa41c0f 100644 --- a/default-recommendations/hash-shortcuts.rkt +++ b/default-recommendations/hash-shortcuts.rkt @@ -99,10 +99,28 @@ (~? failure-result))]) +(define-refactoring-rule hash-map-to-hash-keys + #:description "This `hash-map` expression is equivalent to the `hash-keys` function." + #:literals (hash-map) + [(hash-map h (_:lambda-by-any-name (k1:id v) k2:id)) + #:when (free-identifier=? #'k1 #'k2) + (hash-keys h)]) + + +(define-refactoring-rule hash-map-to-hash-values + #:description "This `hash-map` expression is equivalent to the `hash-values` function." + #:literals (hash-map) + [(hash-map h (_:lambda-by-any-name (k v1:id) v2:id)) + #:when (free-identifier=? #'v1 #'v2) + (hash-values h)]) + + (define hash-shortcuts (refactoring-suite #:name (name hash-shortcuts) - #:rules (list hash-ref-set!-to-hash-ref! + #:rules (list hash-map-to-hash-keys + hash-map-to-hash-values + hash-ref-set!-to-hash-ref! hash-ref-set!-with-constant-to-hash-ref! hash-ref-with-constant-lambda-to-hash-ref-without-lambda hash-ref!-with-constant-lambda-to-hash-ref!-without-lambda