(in-package :remote-snake-server-api) (defclass game-manager () ((games :initform '()) (next-id :initform 0))) (defgeneric create-game (gm) (:documentation "Create a game in the Game Manager.")) (defmethod print-object :around ((gm game-manager) stream) (with-slots (games) gm (format stream "Games: ~a" games))) (defgeneric delete-game (gm game-id) (:documentation "Delete a game from Game Manager.")) (defgeneric get-game (gm game-id) (:documentation "Fetch a game from Game Manager.")) (defmethod delete-game ((gm game-manager) game-id) (get-game gm game-id) ; First try to get the game (if not found, an error will be raised) (with-slots (games) gm (setf games (remove-if #'(lambda (entry) (eql game-id (getf entry :id))) games)))) (defmethod get-game ((gm game-manager) game-id) (with-slots (games) gm (let ((game (remove-if-not #'(lambda (entry) (eql game-id (getf entry :id))) games))) (when (< (length game) 1) (error "Game ~a not found !" game-id)) (getf (first game) :game)))) ;;; Create a new game in gm and return its id (defmethod create-game ((gm game-manager)) (let ((new-game-id nil)) (with-slots (games next-id) gm (push (list :id next-id :game (make-instance 'game)) games) (setf new-game-id next-id) (incf next-id)) new-game-id))