mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
136 lines
2.5 KiB
V
136 lines
2.5 KiB
V
module eventbus
|
|
|
|
pub type EventHandlerFn fn(voidptr, voidptr, voidptr)
|
|
|
|
pub struct Publisher {
|
|
mut:
|
|
registry &Registry
|
|
}
|
|
|
|
pub struct Subscriber {
|
|
mut:
|
|
registry &Registry
|
|
}
|
|
|
|
struct Registry {
|
|
mut:
|
|
events []EventHandler
|
|
}
|
|
|
|
struct EventHandler {
|
|
name string
|
|
handler EventHandlerFn
|
|
receiver voidptr
|
|
once bool
|
|
}
|
|
|
|
pub struct EventBus {
|
|
pub mut:
|
|
registry &Registry
|
|
publisher &Publisher
|
|
pub:
|
|
subscriber &Subscriber
|
|
}
|
|
|
|
pub fn new() &EventBus {
|
|
registry := &Registry{
|
|
events: []
|
|
}
|
|
return &EventBus{
|
|
registry,&Publisher{
|
|
registry},&Subscriber{
|
|
registry}
|
|
}
|
|
}
|
|
|
|
// EventBus Methods
|
|
pub fn (eb &EventBus) publish(name string, sender voidptr, args voidptr) {
|
|
mut publisher := eb.publisher
|
|
publisher.publish(name, sender, args)
|
|
}
|
|
|
|
pub fn (eb &EventBus) clear_all() {
|
|
mut publisher := eb.publisher
|
|
publisher.clear_all()
|
|
}
|
|
|
|
pub fn (eb &EventBus) has_subscriber(name string) bool {
|
|
return eb.registry.check_subscriber(name)
|
|
}
|
|
|
|
// Publisher Methods
|
|
fn (pb mut Publisher) publish(name string, sender voidptr, args voidptr) {
|
|
for i, event in pb.registry.events {
|
|
if event.name == name {
|
|
if event.once {
|
|
pb.registry.events.delete(i)
|
|
}
|
|
if event.receiver != 0 {
|
|
event.handler(event.receiver, args, sender)
|
|
} else {
|
|
event.handler(sender, args, voidptr(0))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn (p mut Publisher) clear_all() {
|
|
if p.registry.events.len == 0 {
|
|
return
|
|
}
|
|
for i := p.registry.events.len - 1; i >= 0; i-- {
|
|
p.registry.events.delete(i)
|
|
}
|
|
}
|
|
|
|
// Subscriber Methods
|
|
pub fn (s mut Subscriber) subscribe(name string, handler EventHandlerFn) {
|
|
s.registry.events << EventHandler {
|
|
name: name
|
|
handler: handler
|
|
receiver: voidptr(0)
|
|
}
|
|
}
|
|
|
|
pub fn (s mut Subscriber) subscribe_method(name string, handler EventHandlerFn, receiver voidptr) {
|
|
s.registry.events << EventHandler {
|
|
name: name
|
|
handler: handler
|
|
receiver: receiver
|
|
}
|
|
}
|
|
|
|
pub fn (s mut Subscriber) subscribe_once(name string, handler EventHandlerFn) {
|
|
s.registry.events << EventHandler {
|
|
name: name
|
|
handler: handler
|
|
receiver: voidptr(0)
|
|
once: true
|
|
}
|
|
}
|
|
|
|
pub fn (s &Subscriber) is_subscribed(name string) bool {
|
|
return s.registry.check_subscriber(name)
|
|
}
|
|
|
|
pub fn (s mut Subscriber) unsubscribe(name string, handler EventHandlerFn) {
|
|
// v := voidptr(handler)
|
|
for i, event in s.registry.events {
|
|
if event.name == name {
|
|
if event.handler == handler {
|
|
s.registry.events.delete(i)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Registry Methods
|
|
fn (r &Registry) check_subscriber(name string) bool {
|
|
for event in r.events {
|
|
if event.name == name {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|