(defpackage :find
   (:use common-lisp)
   (:shadow find))

(in-package :find)

(defgeneric find (collection query))

(defstruct range
  (before 0 :type integer)
  (after  0 :type integer))

(defclass a () ())

(defmethod find ((c a) (q integer)) q)

(defclass b () ())

(defmethod find ((c b) (q range)) q)

(defun main ()
  (let ((a (make-instance 'a))
        (b (make-instance 'b))
        (r (make-range :before 1 :after 3)))
    (print (find a 1))
    (print (find b r))))

(main)