32 lines
923 B
Racket
32 lines
923 B
Racket
#lang racket
|
|
|
|
(require racket/dict racket/list)
|
|
|
|
(define-struct alist (v)
|
|
#:methods gen:dict
|
|
[(define (dict-ref dict key
|
|
[default (lambda () (error "key not found" key))])
|
|
(cond [(assoc key (alist-v dict)) => cdr]
|
|
[else (if (procedure? default) (default) default)]))
|
|
(define (dict-set dict key val)
|
|
(alist (cons (cons key val) (alist-v dict))))
|
|
(define (dict-remove dict key)
|
|
(define al (alist-v dict))
|
|
(remove* (assoc key al) al))
|
|
(define (dict-count dict #:default [x #f])
|
|
(or x
|
|
(length (remove-duplicates (alist-v dict) #:key car))))])
|
|
|
|
|
|
(module+ test
|
|
(require rackunit)
|
|
|
|
(define d1 '((1 . a) (2 . b)))
|
|
|
|
(check-true (dict? d1))
|
|
(check-eq? (dict-ref d1 1) 'a)
|
|
(check-equal? (dict-count (dict-remove d1 2)) 1)
|
|
(check-false (dict-mutable? d1))
|
|
(check-true (dict-can-remove-keys? d1))
|
|
(check-true (dict-can-functional-set? d1)))
|