;;;; cl-scopes/util/index ;;;; smart string-based indexes e.g. for queryable registries (defpackage :scopes/util/index (:use :common-lisp) (:local-nicknames (:alx :alexandria)) (:export #:create #:put #:query)) (in-package :scopes/util/index) (defclass index () ((data :reader data :initform (make-hash-table :test #'equal)))) (defun create () (make-instance 'index)) (defgeneric put (idx key value) (:method ((idx index) key value) (let* ((data (data idx)) (cur (gethash key data))) (setf (gethash key data) (cons value cur))))) (defgeneric query (idx pat) (:method ((idx index) pat) (if (equal pat "*") (alx:flatten (alx:hash-table-values (data idx))) (gethash pat (data idx)))))