Event Bus
Let's create an event bus that the entire application can interact with
Event Type
type Event = (name) => ({
name: name
})Event Bus
type EventBus = () => ({
events: {},
addEvent: (e) => {
if (e.info().typename != "Event") {
println(f"${e} is not a valid Event")
return
}
if (this.events[e.name]) {
println(f"Event ${e} is already defined")
return
}
this.events[e.name] = {
event: e,
subscribers: []
}
},
removeEvent: (event_name) => {
this.events.remove_prop(event_name)
},
subscribe: (event_name, callback) => {
if (!this.events[event_name]) {
println(f"No such event \"${event_name}\"")
return
}
this.events[event_name].subscribers.append(callback)
},
unsubscribe: (event_name, callback) => {
if (!this.events[event_name]) {
println(f"No such event \"${event_name}\"")
return
}
for (this.events[event_name].subscribers, index, sub) {
if (sub == callback) {
this.events[event_name].subscribers.remove(index)
break
}
}
},
emit: (event_name, payload = None) => {
if (!this.events[event_name]) {
println(f"No such event \"${event_name}\"")
return
}
const e = this.events[event_name]
for (e.subscribers, index, sub) {
if (sub.info().arity == 0) {
sub()
} else {
sub(payload)
}
}
}
})Last updated