-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdefinitions-table.scm
84 lines (69 loc) · 2.39 KB
/
definitions-table.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
(define-library (definitions-table)
(export make-empty-definitions-table
definitions-count
add-definition
last-definition
contains-definition
lookup-definition
flatmap-definitions
lookup-definition-index
definition-index
get-definitions)
(import (scheme base)
(counted-set)
(wasm-syntax))
(begin
(define (make-definitions-table defs def-counts)
(list defs def-counts))
(define (make-empty-definitions-table)
(make-definitions-table '() (make-counted-set)))
(define (definitions defs)
(car defs))
(define (definition-counts defs)
(cadr defs))
(define (definitions-count defs type)
(counted-set-count (definition-counts defs) type))
(define (add-definition defs def)
(make-definitions-table
(cons def (definitions defs))
(counted-set-add (definition-counts defs) (car def) 1)))
(define (last-definition defs type)
(assq type (definitions defs)))
(define (contains-definition defs def)
(if (member def (definitions defs)) #t #f))
(define (lookup-definition defs predicate)
(let loop ((ds (definitions defs)))
(cond ((null? ds) #f)
((predicate (car ds)) (car ds))
(else (loop (cdr ds))))))
(define (flatmap-definitions defs proc)
(let loop ((ds (definitions defs))
(rs '()))
(if (null? ds)
rs
(loop (cdr ds)
(append (proc (car ds)) rs)))))
(define (lookup-definition-index defs type predicate)
(let loop ((ds (definitions defs))
(count (definitions-count defs type)))
(cond ((null? ds) #f)
((wasm-definition-type? type (car ds))
(if (predicate (car ds))
(- count 1)
(loop (cdr ds) (- count 1))))
(else
(loop (cdr ds) count)))))
(define (definition-index defs def)
(lookup-definition-index
defs
(wasm-definition-type def)
(lambda (d) (equal? def d))))
(define (get-definitions defs type)
(let collect ((ds (definitions defs))
(result '()))
(cond ((null? ds) result)
((eq? type (caar ds))
(collect (cdr ds) (cons (car ds) result)))
(else
(collect (cdr ds) result)))))
))