diff options
Diffstat (limited to 'starling/asset.scm')
-rw-r--r-- | starling/asset.scm | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/starling/asset.scm b/starling/asset.scm index c1a05a1..8ddf945 100644 --- a/starling/asset.scm +++ b/starling/asset.scm @@ -32,7 +32,10 @@ artifact file-name loader - args + loader-args + on-asset-reload + add-subscriber + remove-subscriber watch-assets watching-assets? watch-asset-directory @@ -57,7 +60,8 @@ (file-name #:getter file-name #:init-keyword #:file-name) (loader #:getter loader #:init-keyword #:loader) (loader-args #:getter loader-args #:init-form '() - #:init-keyword #:loader-args)) + #:init-keyword #:loader-args) + (subscribers #:getter subscribers #:init-form (make-weak-key-hash-table))) (define (absolute-file-name file-name) (if (absolute-file-name? file-name) @@ -80,6 +84,23 @@ wt)))) (hash-set! sub-table asset asset))) +(define-method (on-asset-reload obj slot-name) + #t) + +(define-method (add-subscriber (asset <asset>) obj slot-name) + (let ((subs (subscribers asset))) + (hashq-set! subs obj (cons slot-name (hashq-ref subs obj '()))))) + +(define-method (remove-subscriber (asset <asset>) obj slot-name) + (let* ((subs (subscribers asset)) + (slot-names (delq slot-name (hashq-ref subs obj '())))) + (if (null? slot-names) + (hashq-remove! subs obj) + (hashq-set! subs obj slot-names)))) + +(define-method (notify-subscribers (asset <asset>)) + (hash-for-each on-asset-reload (subscribers asset))) + (define-method (asset-purge (asset <asset>)) (hash-remove! (hash-ref (asset-file-map) (file-name asset)) asset)) @@ -151,7 +172,8 @@ (expire-cached-artifact (cache-key asset))) assets) (hash-for-each (lambda (key asset) - (load! asset)) + (load! asset) + (notify-subscribers asset)) assets)))))))) (define (cache-key asset) @@ -192,9 +214,6 @@ (or (hashq-ref (asset-artifact-map) asset) (load! asset #t))) -;; Make assets that are outside of the cache "just work". -(define-method (asset-ref x) x) - ;; Handy syntax for defining new assets. (define-syntax-rule (define-asset name (loader file-name loader-args ...)) |