diff --git a/src/event_bus.c b/src/event_bus.c index faee90e..0530645 100644 --- a/src/event_bus.c +++ b/src/event_bus.c @@ -134,3 +134,21 @@ int event_bus_subscribe(event_bus_t *event_bus, size_t id, callback_t callback, return EXIT_SUCCESS; } + +// Arg : callback_t callback +static inline bool condition_is_callback(elem_t *elem, va_list args) +{ + return ((subscription_t *)elem->data)->callback == va_arg(args, callback_t); +} + +int event_bus_unsubscribe(event_bus_t *event_bus, size_t id, callback_t callback) +{ + elem_t *topic_elem = linked_list_get_if(&event_bus->topics, condition_is_topic_id, id); + if(!topic_elem) return_failure_int; + + topic_t *topic = topic_elem->data; + + if(linked_list_remove_if(&topic->subscriptions, condition_is_callback, callback)) return_failure_int; + + return EXIT_SUCCESS; +} diff --git a/src/headers/event_bus.h b/src/headers/event_bus.h index c5371b0..d961035 100644 --- a/src/headers/event_bus.h +++ b/src/headers/event_bus.h @@ -35,5 +35,6 @@ int event_bus_change_topic_id(event_bus_t *event_bus, size_t old_id, size_t new_ int event_bus_publish(event_bus_t *event_bus, size_t id, ...); int event_bus_subscribe(event_bus_t *event_bus, size_t id, callback_t callback, void *data); +int event_bus_unsubscribe(event_bus_t *event_bus, size_t id, callback_t callback); #endif // EVENT_BUS_H \ No newline at end of file