Reimplement and document ldict-filter.

This commit is contained in:
Dominik Pantůček 2023-04-09 20:00:17 +02:00
parent bd7421b626
commit 90fa195dc5
2 changed files with 20 additions and 9 deletions

View file

@ -112,6 +112,15 @@ if it accepts three arguments, the key, value and numeric index
In all cases the value the procedure returns is taken as the new value
for given key.
(ldict-filter pred? ld)
* ```pred?``` - predicate procedure
* ```ld``` -a ldict instance
Returns a new dictionary containing only key/value pairs matching the
given predicate. The procedure ```pred?``` must accept two arguments -
the key and the value.
### IO
(import util-io)

View file

@ -179,15 +179,17 @@
;; Returns a dictionary containing only kv pairs matching the
;; predicate which must accept two arguments. Unlike list filter,
;; does not perform final reverse on the result.
(define (dict-filter pred? d)
(let loop ((d d)
(r '()))
(if (null? d)
r
(loop (cdr d)
(if (pred? (caar d) (cdar d))
(cons (car d) r)
r)))))
(define (ldict-filter pred? ld)
(let loop ((pairs (ldict-pairs ld))
(res '()))
(if (null? pairs)
(cons TAG-LDICT
(cons (ldict-meta ld)
res))
(loop (cdr pairs)
(if (pred? (caar pairs) (cdar pairs))
(cons (car pairs) res)
res)))))
;; Reduce over dictinary, the reducing procedure gets accumulator,
;; key and value as its three arguments.