cl-scopes/util/index.lisp

28 lines
740 B
Common Lisp

;;;; 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)))))