|
117 | 117 | ;;; |
118 | 118 |
|
119 | 119 | (define (make-trie :optional (tab-make #f) (tab-get #f) (tab-put! #f) |
120 | | - (tab-fold #f)) |
| 120 | + (tab-fold #f) (tab-empty? #f)) |
121 | 121 | (apply make <trie> |
122 | 122 | (cond-list |
123 | 123 | (tab-make @ `(:tab-make ,tab-make)) |
124 | 124 | (tab-get @ `(:tab-get ,tab-get)) |
125 | 125 | (tab-put! @ `(:tab-put! ,tab-put!)) |
126 | | - (tab-fold @ `(:tab-fold ,tab-fold))))) |
| 126 | + (tab-fold @ `(:tab-fold ,tab-fold)) |
| 127 | + (tab-empty? @ `(:tab-empty? ,tab-empty?))))) |
127 | 128 |
|
128 | 129 | (define (trie params . keys&vals) |
129 | 130 | (rlet1 t (apply make-trie params) |
|
223 | 224 |
|
224 | 225 | ;; internal: Trie, Node -> Boolean |
225 | 226 | (define (%trie-node-empty? trie node) |
226 | | - (cond |
227 | | - [(slot-ref trie'tab-empty?) => (^[empty?] (empty? node))] |
228 | | - ;; some heuristics |
229 | | - [(and (hash-table? (%node-table node)) |
230 | | - (eq? (slot-ref trie'tab-fold) hash-table-fold)) |
231 | | - (zero? (hash-table-num-entries (%node-table node)))] |
232 | | - [(%node-table node) => (cut (slot-ref trie'tab-fold) <> (^[k n s] #t) #f)] |
233 | | - [else #t])) |
| 227 | + (if-let1 tab (%node-table node) |
| 228 | + (cond |
| 229 | + [(slot-ref trie'tab-empty?) => (^[empty?] (empty? tab))] |
| 230 | + ;; some heuristics |
| 231 | + [(and (hash-table? tab) |
| 232 | + (eq? (slot-ref trie'tab-fold) hash-table-fold)) |
| 233 | + (zero? (hash-table-num-entries tab))] |
| 234 | + [else (slot-ref trie'tab-fold) tab (^[k n s] #t) #f]) |
| 235 | + #t)) |
234 | 236 |
|
235 | 237 | ;; Public APIs |
236 | 238 |
|
|
0 commit comments