multiassoc-syntax.rkt (1328B)
1 #lang typed/racket 2 (require "typed-untyped.rkt") 3 (define-typed/untyped-modules #:no-test 4 (provide multiassoc-syntax 5 cdr-assoc-syntax 6 assoc-syntax) 7 8 (require "typed-untyped.rkt") 9 (if-typed (require phc-toolkit/aliases) 10 (require phc-toolkit/untyped/aliases)) 11 (require-typed/untyped "stx.rkt") 12 13 ;; TODO: cdr-stx-assoc is already defined in lib/low.rkt 14 15 (define-type (Stx-AList A) 16 (Syntaxof (Listof (Syntaxof (Pairof Identifier A))))) 17 18 (: multiassoc-syntax (∀ (A) (→ Identifier (Stx-AList A) (Listof A)))) 19 (define (multiassoc-syntax query alist) 20 ((inst map A (Syntaxof (Pairof Identifier A))) 21 stx-cdr 22 (filter (λ ([xy : (Syntaxof (Pairof Identifier A))]) 23 (free-identifier=? query (stx-car xy))) 24 (syntax->list alist)))) 25 26 (: cdr-assoc-syntax (∀ (A) (→ Identifier (Stx-AList A) A))) 27 (define (cdr-assoc-syntax query alist) 28 (stx-cdr (assert (assoc-syntax query alist)))) 29 30 (: assoc-syntax (∀ (A) (→ Identifier 31 (Stx-AList A) 32 (U False (Syntaxof (Pairof Identifier A)))))) 33 (define (assoc-syntax query alist) 34 (findf (λ ([xy : (Syntaxof (Pairof Identifier A))]) 35 (free-identifier=? query (stx-car xy))) 36 (syntax->list alist))))