lang/private/hash.rkt
#lang s-exp "../kernel.rkt"

(provide hash-map hash-for-each)

(define (hash-map a-hash f)
  (unless (hash? a-hash)
    (raise-type-error 'hash-map "hash" a-hash))
  (unless (and (procedure? f) (procedure-arity-includes? f 2))
    (raise-type-error 'hash-map "procedure (arity 2)" f))
  (let loop ([keys (hash-keys a-hash)])
    (if (null? keys)
        '()
        (cons (f (car keys) (hash-ref a-hash (car keys)))
              (loop (cdr keys))))))


(define (hash-for-each a-hash f)
  (unless (hash? a-hash)
    (raise-type-error 'hash-for-each "hash" a-hash))
  (unless (and (procedure? f) (procedure-arity-includes? f 2))
    (raise-type-error 'hash-for-each "procedure (arity 2)" f))
  (let loop ([keys (hash-keys a-hash)])
    (if (null? keys)
        (void)
        (begin
          (f (car keys) (hash-ref a-hash (car keys)))
          (loop (cdr keys))))))