racket/collects/tests/generic/struct-form.rkt
2012-05-24 16:51:14 -04:00

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)))