Event buses (as hash tables for speed)
This commit is contained in:
parent
04a6555cbd
commit
f1d6342089
2 changed files with 71 additions and 2 deletions
|
|
@ -220,4 +220,73 @@
|
|||
(assert (symbol? name))
|
||||
(queue-del-system name)
|
||||
name)
|
||||
|
||||
;; System execution
|
||||
;; TODO: Implement
|
||||
|
||||
;; Event buses hash table
|
||||
(define event-buses (make-hash-table))
|
||||
|
||||
;; Event bus interface
|
||||
(export register-event-bus remove-event-bus fetch-event-bus
|
||||
push-event peek-event pop-event)
|
||||
|
||||
;; Register a new event bus
|
||||
(define (register-event-bus name)
|
||||
(assert (symbol? name))
|
||||
(if (hash-table-exists? event-buses name)
|
||||
#f
|
||||
(begin
|
||||
(hash-table-set! event-buses name (make-hash-table))
|
||||
name)))
|
||||
|
||||
;; Remove an event bus
|
||||
(define (remove-event-bus name)
|
||||
(assert (symbol? name))
|
||||
(if (hash-table-exists? event-buses name)
|
||||
(begin
|
||||
(hash-table-delete! event-buses name)
|
||||
name)
|
||||
#f))
|
||||
|
||||
;; Fetch an event bus by name, or #f if it doesn't exist
|
||||
(define (fetch-event-bus name)
|
||||
(assert (symbol? name))
|
||||
(if (hash-table-exists? event-buses name)
|
||||
(hash-table-ref event-buses name)
|
||||
#f))
|
||||
|
||||
;; Push an event to the specified bus, return #f on failure (if the bus doesn't exist
|
||||
(define (push-event bus action event)
|
||||
(assert (symbol? bus))
|
||||
(assert (symbol? action))
|
||||
(assert (record? event))
|
||||
(let ((event-bus (fetch-event-bus bus)))
|
||||
(if event-bus
|
||||
(begin
|
||||
(hash-table-set! event-bus action event)
|
||||
#t)
|
||||
#f)))
|
||||
|
||||
;; Retrieve an event from the event bus, if it exists. Return false if it doesn't
|
||||
(define (peek-event bus action)
|
||||
(assert (symbol? bus))
|
||||
(assert (symbol? action))
|
||||
(let ((event-bus (fetch-event-bus bus)))
|
||||
(if (and event-bus
|
||||
(hash-table-exists? event-bus action))
|
||||
(hash-table-ref event-bus action)
|
||||
#f)))
|
||||
|
||||
;; Retrieve an event from the event bus, if it exists, then delete it. Return false if it doesn't exist.
|
||||
(define (pop-event bus action)
|
||||
(assert (symbol? bus))
|
||||
(assert (symbol? action))
|
||||
(let ((event-bus (fetch-event-bus bus)))
|
||||
(if (and event-bus
|
||||
(hash-table-exists? event-bus action))
|
||||
(let ((event (hash-table-ref event-bus action)))
|
||||
(hash-table-delete! event-bus action)
|
||||
event)
|
||||
#f)))
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue