;;;; cl-scopes/util/index ;;;; smart string-based indexes e.g. for queryable registries (defpackage :scopes/util/index (:use :common-lisp) (: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 key) (:method ((idx index) key) (gethash key (data idx))))