Event buses (as hash tables for speed)

This commit is contained in:
BirDt_ 2026-03-28 19:14:54 +08:00
parent 04a6555cbd
commit f1d6342089
2 changed files with 71 additions and 2 deletions

View file

@ -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)))
)