A collection of tools for dealing with key/value data structures such as plists, alists and hash-tables. === kvalist->filter-keys alist &rest keys === Return the //alist// filtered to the //keys// list. Only pairs where the car is a [[member]] of //keys// will be returned. === kvalist->hash alist &rest hash-table-args === Convert //alist// to a HASH. //hash-table-args// are passed to the hash-table creation. === kvalist->keys alist === Get just the keys from the alist. === kvalist->plist alist === Convert an alist to a plist. === kvalist->values alist === Get just the values from the alist. === kvalist-keys->* alist fn === Convert the keys of //alist// through //fn//. === kvalist-keys->symbols alist === Convert the keys of //alist// into symbols. === kvalist-sort alist pred === Sort //alist// (by key) with //pred//. === kvalist-sort-by-value alist pred === Sort //alist// by value with //pred//. === kvalist2->alist alist2 car-key cdr-key &optional proper === Reduce the //alist2// (a list of alists) to a single alist. //car-key// is the key of each alist to use as the resulting key and //cdr-key// is the key of each alist to user as the resulting cdr. If //proper// is [[t]] then the alist is a list of proper lists, not cons cells. === kvalist2->filter-keys alist2 &rest keys === Return the //alist2// (a list of alists) filtered to the //keys//. === kvalist2->plist alist2 === Convert a list of alists too a list of plists. === kvcmp a b === Do a comparison of the two values using printable syntax. Use this as the function to pass to [[sort]]. === kvdotassoc expr table === Dotted expression handling with [[assoc]]. === kvdotassoc-fn expr table func === Use the dotted //expr// to access deeply nested data in //table//. //expr// is a dot separated expression, either a symbol or a string. For example: {{{ "a.b.c" }}} or: {{{ 'a.b.c }}} If the //expr// is a symbol then the keys of the alist are also expected to be symbols. //table// is expected to be an alist currently. //func// is some sort of [[assoc]] like function. === kvdotassq expr table === Dotted expression handling with [[assq]]. === kvhash->alist hash === Convert //hash// to an ALIST. === kvmap-bind args sexp seq === A hybrid of [[destructuring-bind]] and [[mapcar]] //args// shall be of the form used with [[destructuring-bind]] Unlike most other mapping forms this is a macro intended to be used for structural transformations, so the expected usage will be that //args// describes the structure of the items in //seq//, and //sexp// will describe the structure desired. === kvplist->alist plist === Convert //plist// to an alist. The keys are expected to be :prefixed and the colons are removed. The keys in the resulting alist are symbols. === kvplist->filter-keys plist &rest keys === Filter the plist to just those matching //keys//. //keys// must actually be :-less symbols. [[kvalist->filter-keys]] is actually used to do this work. === kvplist->merge &rest plists === Merge the 2nd and subsequent plists into the first, clobbering values set by lists to the left. === kvplist2->filter-keys plist2 &rest keys === Return the //plist2// (a list of plists) filtered to the //keys//.