forked from Shirakumo/trial
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresource-generator.lisp
49 lines (37 loc) · 1.81 KB
/
resource-generator.lisp
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
#|
This file is a part of trial
(c) 2017 Shirakumo http://tymoon.eu (shinmera@tymoon.eu)
Author: Nicolas Hafner <shinmera@tymoon.eu>
|#
(in-package #:org.shirakumo.fraf.trial)
(defclass resource-generator ()
((observers :initform (tg:make-weak-hash-table :weakness :key) :accessor observers)))
(defgeneric generate-resources (generator input &key &allow-other-keys))
(defgeneric register-generation-observer (observer generator))
(defgeneric clear-observers (generator))
(defgeneric observe-generation (observer generator result))
(defgeneric resource (generator identifier))
(defmethod resource ((generator resource-generator) id) NIL)
(defmethod register-generation-observer (observer (generator resource-generator))
(setf (gethash observer (observers generator)) T))
(defmethod clear-observers ((generator resource-generator))
(clrhash (observers generator)))
(defmethod generate-resources :around ((generator resource-generator) input &key)
(let ((result (call-next-method)))
(loop for observer being the hash-keys of (observers generator)
do (observe-generation observer generator result))
result))
(defmethod generate-resources ((generator symbol) input &rest args)
(apply #'generate-resources (make-instance generator) input args))
(defclass compiled-generator (resource-generator)
())
(defgeneric compile-resources (generator source &key))
(defmethod generate-resources :before ((generator compiled-generator) source &key compile)
(when compile
(compile-resources generator source)))
(defun recompile-needed-p (targets sources)
(let ((latest (loop for source in (enlist sources)
maximize (file-write-date source))))
(loop for target in (enlist targets)
thereis (or (null (probe-file target))
(< (file-write-date target) latest)))))