diff --git a/doc/utils.md b/doc/utils.md index 7131c19..65bf4af 100644 --- a/doc/utils.md +++ b/doc/utils.md @@ -31,6 +31,24 @@ representing its contents. Splits given loaded CSV into two tables at the first empty row. +### Dictionary + + (import util-dict) + +This module implements a simple key/value dictionary using lists as +backend. All operations are O(n) with respect to time. + + (make-ldict [equality?/pairs [pairs]]) + +* ```equality?/pairs``` - procedure or list of pairs +* ```pairs``` - list of pairs + +Creates a new ldict with configurable equality procedure, optionally +populating it with initial data. + +If only one argument is given, the procedure checks whether it is a +list of equality procedure and acts accordingly. + ### IO (import util-io) diff --git a/src/util-dict.scm b/src/util-dict.scm index 1628a7c..9dbf947 100644 --- a/src/util-dict.scm +++ b/src/util-dict.scm @@ -28,7 +28,10 @@ (module util-dict-list ( + TAG-LDICT + make-ldict + ldict-has-key? ldict-ref ldict-remove @@ -43,14 +46,30 @@ (import scheme (chicken base) - testing) + testing + util-tag) - ;; Returns an empty dictionary represented as empty list or a list of - ;; pre-initialized cons pairs. - (define (make-dict . pairs) - (if (null? pairs) - '() - (car pairs))) + ;; Tag used for identifying list dictionaries from this module + (define TAG-LDICT (make-tag LDICT)) + + ;; Creates an empty dictionary and optionally populates it with + ;; provided pairs. Default equality is eq?, default are '(). + (define (make-ldict . equality?/pairs) + (let ((equality? (if (or (null? equality?/pairs) + (not (procedure? (car equality?/pairs)))) + eq? + (car equality?/pairs))) + (pairs (if (or (null? equality?/pairs) + (procedure? (car equality?/pairs))) + '() + (car equality?/pairs)))) + (let loop ((ld (list TAG-LDICT + (list equality?))) + (pairs pairs)) + (if (null? pairs) + ld + (loop (ldict-set ld (caar pairs) (cdar pairs)) + (cdr pairs)))))) ;; Checks whether given dictionary d contains the key k. (define (dict-has-key? d k)