2019-04-30 15:22:40 +00:00
|
|
|
#lang turnstile
|
|
|
|
|
|
|
|
(provide Hash
|
|
|
|
(for-syntax ~Hash)
|
|
|
|
hash
|
|
|
|
hash-set
|
|
|
|
hash-ref
|
2019-05-17 14:34:33 +00:00
|
|
|
(typed-out [[hash-ref/failure- : (∀ (K V) (→fn (Hash K V) K V V))]
|
|
|
|
hash-ref/failure])
|
2019-04-30 15:22:40 +00:00
|
|
|
hash-has-key?
|
|
|
|
hash-update
|
2019-05-17 14:34:33 +00:00
|
|
|
(typed-out [[hash-update/failure- : (∀ (K V) (→fn (Hash K V) K (→fn V V) V (Hash K V)))]
|
2019-05-15 21:25:11 +00:00
|
|
|
hash-update/failure])
|
2019-04-30 15:22:40 +00:00
|
|
|
hash-remove
|
|
|
|
hash-map
|
|
|
|
hash-keys
|
|
|
|
hash-values
|
|
|
|
hash-keys-subset?
|
|
|
|
hash-count
|
|
|
|
hash-empty?
|
|
|
|
hash-union
|
2019-05-15 21:25:11 +00:00
|
|
|
(typed-out [[hash-union/combine- : (∀ (K V) (→fn (Hash K V) (Hash K V) (→fn V V V) (Hash K V)))]
|
|
|
|
hash-union/combine])
|
2019-04-30 15:22:40 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
(require "core-types.rkt")
|
|
|
|
(require (only-in "list.rkt" List))
|
2019-05-09 14:23:15 +00:00
|
|
|
(require (only-in "prim.rkt" Int Bool))
|
2019-04-30 15:22:40 +00:00
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;; Immutable Hash Tables
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
|
|
(define-container-type Hash #:arity = 2)
|
|
|
|
|
2020-12-08 15:42:05 +00:00
|
|
|
(define-typed-syntax (hash (~seq key:expr val:expr) ...) ≫
|
2019-04-30 15:22:40 +00:00
|
|
|
[⊢ key ≫ key- (⇒ : τ-k)] ...
|
|
|
|
[⊢ val ≫ val- (⇒ : τ-val)] ...
|
|
|
|
#:fail-unless (all-pure? #'(key- ... val- ...)) "gotta be pure"
|
|
|
|
--------------------------------------------------
|
2020-12-08 15:42:05 +00:00
|
|
|
[⊢ (#%app- hash- (~@ key val) ...) (⇒ : (Hash (U τ-k ...) (U τ-val ...)))])
|
2019-04-30 15:22:40 +00:00
|
|
|
|
|
|
|
(require/typed racket/base
|
|
|
|
;; don't have a type for ConsPair
|
|
|
|
#;[make-hash : (∀ (K V) (→fn (List (ConsPair K V)) (Hash K V)))]
|
|
|
|
[hash-set : (∀ (K V) (→fn (Hash K V) K V (Hash K V)))]
|
|
|
|
[hash-ref : (∀ (K V) (→fn (Hash K V) K V))]
|
|
|
|
;; TODO hash-ref/failure
|
|
|
|
[hash-has-key? : (∀ (K V) (→fn (Hash K V) K Bool))]
|
2019-05-15 20:05:30 +00:00
|
|
|
[hash-update : (∀ (K V) (→fn (Hash K V) K (→fn V V) (Hash K V)))]
|
2019-04-30 15:22:40 +00:00
|
|
|
;; TODO hash-update/failure
|
|
|
|
[hash-remove : (∀ (K V) (→fn (Hash K V) K (Hash K V)))]
|
|
|
|
[hash-map : (∀ (K V R) (→fn (Hash K V) (→fn K V R) (List R)))]
|
|
|
|
[hash-keys : (∀ (K V) (→fn (Hash K V) (List K)))]
|
|
|
|
[hash-values : (∀ (K V) (→fn (Hash K V) (List V)))]
|
|
|
|
;; TODO hash->list makes cons pairs
|
|
|
|
#;[hash->list : (∀ (K V) (→fn (Hash K V) (List (ConsPair K V))))]
|
|
|
|
[hash-keys-subset? : (∀ (K1 V1 K2 V2) (→fn (Hash K1 V1) (Hash K2 V2) Bool))]
|
|
|
|
[hash-count : (∀ (K V) (→fn (Hash K V) Int))]
|
|
|
|
[hash-empty? : (∀ (K V) (→fn (Hash K V) Bool))])
|
|
|
|
|
|
|
|
(require/typed racket/hash
|
|
|
|
[hash-union : (∀ (K1 V1 K2 V2) (→fn (Hash K1 V1) (Hash K2 V2) (Hash (U K1 K2) (U V1 V2))))]
|
|
|
|
;; TODO - hash-union with #:combine
|
|
|
|
)
|
2019-05-15 21:25:11 +00:00
|
|
|
|
2019-05-17 14:34:33 +00:00
|
|
|
(define- (hash-ref/failure- h k err)
|
|
|
|
(#%app- hash-ref- h k err))
|
|
|
|
|
2019-05-15 21:25:11 +00:00
|
|
|
(define- (hash-update/failure- h k u err)
|
|
|
|
(#%app- hash-update- h k u err))
|
|
|
|
|
|
|
|
(define- (hash-union/combine- h1 h2 combine)
|
|
|
|
(#%app- hash-union- h1 h2 #:combine combine))
|