blob: 17c02e75c4c19dac6b6586aadca39900f7e2e26c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
(defpackage inventory
(:use :cl)
(:export :inventory
:add-item
:remove-item))
(in-package :inventory)
(defclass inventory ()
((size :initarg :size
:reader size)
(filled :initform 0
:accessor filled)
(items :initform '()
:accessor items)))
(defmethod find-item ((inv inventory) name)
(with-slots (items) inv
(find-if
#'(lambda (i)
(equal (commodities:name (car i)) name))
items)))
(defmethod delete-item ((inv inventory) item)
;; removes <item> from inventory list and substracts
;; its stored quantity from the filled attribute
(with-slots (filled items) inv
(setq items (remove item items))
(setq filled (- filled (cdr item)))))
(defmethod add-item ((inv inventory) item quantity)
;; add <quantity> of <item> to inventory
(with-slots (size filled items) inv
(when (> size (+ filled quantity))
(let* ((old-item
(find-item inv (commodities:name item)))
(qt (if old-item
(progn
(delete-item inv old-item)
(+ quantity (cdr old-item)))
quantity)))
(prog1
(setq filled (+ filled qt))
(push (cons item qt)
items))))))
(defmethod remove-item ((inv inventory) name quantity)
;; remove <quantity> of <item> from inventory
;; quantity must be positive or zero
(assert (>= quantity 0))
(with-slots (filled items) inv
(let ((item (find-item inv name)))
(when item
(delete-item inv item)
(if (< quantity (cdr item))
(progn
(add-item inv
(car item)
(- (cdr item) quantity))
(cons (car item) quantity))
item)))))
|