#include <pzk_interrupt_dispatcher.h>
#include <stdlib.h>

static void pzk_interrupt_dispatcher_notify(pzk_dispatcher_t*);
static void destroy_pzk_interrupt_dispatcher(pzk_interrupt_dispatcher_t*);

pzk_interrupt_dispatcher_t* new_pzk_interrupt_dispatcher(pzk_channel_t* channel, interrupt_fn cb, void* arg) {
    pzk_interrupt_dispatcher_t* dispatcher = (pzk_interrupt_dispatcher_t*) calloc(1, sizeof(pzk_interrupt_dispatcher_t));
    dispatcher->base.channel  = channel;
    dispatcher->base.notify   = pzk_interrupt_dispatcher_notify;
    dispatcher->interrupt_cb  = cb;
    dispatcher->interrupt_arg = arg;
    dispatcher->destroy       = destroy_pzk_interrupt_dispatcher;

    return dispatcher;
}

void destroy_pzk_interrupt_dispatcher(pzk_interrupt_dispatcher_t* dispatcher) {
    free(dispatcher);
}

void pzk_interrupt_dispatcher_notify(pzk_dispatcher_t* _dispatcher) {
    pzk_interrupt_dispatcher_t* dispatcher = (pzk_interrupt_dispatcher_t*) _dispatcher;
    dispatcher->interrupt_cb(dispatcher->interrupt_arg, 0);
}