== alist-lib SRFI-69-like library for alists [[toc:]] === {{alist-values}} (alist-values alist) → list Extract the associations from an alist. ; alist : The alist from which to extract (define (alist-values alist) (map cdr alist)) === {{alist-keys}} (alist-keys alist) → list Extract the keys from an alist. ; alist : The alist from which to extract (define (alist-keys alist) (map car alist)) === {{alist-map}} (alist-map f alist) → list Map across an alist; {{f}} takes two parameters: {{key}} and {{values}}. ; f : The function to apply to each key-value association ; alist : The alist to apply to (define (alist-map f alist) (map (match-lambda ((key . values) (f key values))) alist)) === {{alist-set!}} (alist-set! alist key value) → unspecified Destructively set a key-value association. ; alist : The alist in which to set ; key : The key to set ; value : The value to associate with the key (define-syntax alist-set! (lambda (expression rename compare) (match expression ((_ variable key value) (let ((%if (rename 'if)) (%null? (rename 'null?)) (%set! (rename 'set!)) (%list (rename 'list)) (%cons (rename 'cons)) (%alist-prepend! (rename 'alist-prepend!))) `(,%if (,%null? ,variable) (,%set! ,variable (,%list (,%cons ,key ,value))) (,%alist-prepend! ,variable ,key ,value))))))) === {{alist-update!}} (alist-update! alist key function) → unspecified (alist-update! alist key function thunk) → unspecified (alist-update! alist key function thunk =) → unspecified On analogy with hash-table-update!, descructively update an association. ; alist : The alist to update ; key : The key associated with the update ; f : A monadic function taking the preëxisting key ; thunk : The thunk to apply if no association exists ; = : The equality predicate for keys (define alist-update! (case-lambda ((alist key function) (alist-update! alist key function (lambda () (error "Key not found -- ALIST-UPDATE!" key)))) ((alist key function thunk) (alist-update! alist key function thunk eqv?)) ((alist key function thunk =) (let ((pair (assoc key alist =))) (if pair (set-cdr! pair (function (cdr pair))) (alist-set! alist key (function (thunk)))))))) === {{alist-update!/default}} (alist-update!/default alist key function default) → unspecified (alist-update!/default alist key function default =) → unspecified On analogy with hash-table-update!, descructively update an association. ; alist : The alist to update ; key : The key associated with the update ; f : A monadic function taking the preëxisting key ; default : The default value if no association exists ; = : The equality predicate for keys (define alist-update!/default (case-lambda ((alist key function default) (alist-update!/default alist key function default eqv?)) ((alist key function default =) (alist-update! alist key function (lambda () default))))) === {{alist-ref}} (alist-ref alist key) → object (alist-ref alist key thunk) → object (alist-ref alist key thunk =) → object Return a value associated with its key or apply {{thunk}}. ; alist : The alist to search in ; key : The key whose value to return ; thunk : The thunk to apply when association doesn't exist (default is to err) ; = : The equality predicate to apply to keys (define alist-ref (case-lambda ((alist key) (alist-ref alist key (lambda () (error "Key not found -- ALIST-REF" key)))) ((alist key thunk) (alist-ref alist key thunk eqv?)) ((alist key thunk =) (let ((value (assoc key alist =))) (if value (cdr value) (thunk)))))) === {{alist-ref/default}} (alist-ref/default alist key default) → object (alist-ref/default alist key default =) → object Return a value associated with its key or {{default}}. ; alist : The alist to search in ; key : The key whose value to return ; default : The default to return when association doesn't exist ; = : The equality predicate to apply to keys (define alist-ref/default (case-lambda ((alist key default) (alist-ref alist key (lambda () default))) ((alist key default =) (alist-ref alist key (lambda () default) =)))) === {{alist-size}} (alist-size alist) → integer Calculate size of alist. ; alist : The alist whose size to calculate (define alist-size length) === {{alist-fold}} (alist-fold alist f init) → object Fold an alist; whose {{f}} takes key, accumulatum, value. ; alist : The alist to fold ; f : The function to apply to key, accumulatum, value ; init : The seed of the fold (define (alist-fold alist f init) (fold (lambda (association accumulatum) (match association ((key . value) (f key accumulatum value)))) init alist)) === {{alist-set}} (alist-set alist key value) → alist Non-destructively associate a key and value in the alist. ; alist : Alist in which to set ; key : The key to set ; value : The value to associate with key (define (alist-set alist key value) (alist-cons key value alist)) === About this egg ==== Author [[/users/klutometis|Peter Danenberg]] ==== Repository [[https://github.com/klutometis/alist-lib]] ==== License BSD ==== Dependencies * [[cock]] * [[debug]] * [[matchable]] * [[setup-helper]] ==== Versions ; [[https://github.com/klutometis/alist-lib/releases/tag/0.1|0.1]] : Version 0.1 ; [[https://github.com/klutometis/alist-lib/releases/tag/0.1.1|0.1.1]] : Version 0.1.1 ; [[https://github.com/klutometis/alist-lib/releases/tag/0.1.2|0.1.2]] : Meta fixes ; [[https://github.com/klutometis/alist-lib/releases/tag/0.1.3|0.1.3]] : More meta ; [[https://github.com/klutometis/alist-lib/releases/tag/0.1.4|0.1.4]] : Housekeeping ; [[https://github.com/klutometis/alist-lib/releases/tag/0.2.1|0.2.1]] : Change to BSD. ; [[https://github.com/klutometis/alist-lib/releases/tag/0.2.2|0.2.2]] : Remove debug ; [[https://github.com/klutometis/alist-lib/releases/tag/0.2.3|0.2.3]] : Add docs. ; [[https://github.com/klutometis/alist-lib/releases/tag/0.2.4|0.2.4]] : Failure condition ; [[https://github.com/klutometis/alist-lib/releases/tag/0.2.5|0.2.5]] : With a note about cock-utils ; [[https://github.com/klutometis/alist-lib/releases/tag/0.2.6|0.2.6]] : Add test-exit. ; [[https://github.com/klutometis/alist-lib/releases/tag/0.2.7|0.2.7]] : alist-set! should work on empty lists. ==== Colophon Documented by [[/egg/cock|cock]].