#include <why.h>
#include <why-messagequeue.h>
#include <why-irq.h>
#include <why-eventloop.h>

int main()
{
    Why::init();

    Why::MessageQueue<int> q1(7);
    Why::MessageQueue<int> q2(5);

    Why::IRQ::connect(7,  [&q1](int){auto ok = q1.put_noblock(1); assert(ok);});
    Why::IRQ::connect(42, [&q2](int){auto ok = q2.put_noblock(2); assert(ok);});

    Why::Eventloop loop;
    loop.watch(q1, [&q1](){
        int elem = q1.get();                           // <-- does not block
        std::println("q1: {}", elem);
    });
    loop.watch(q2, [&q2](){
        int elem = q2.get();                           // <-- does not block
        std::println("q2: {}", elem);
    });

    loop();                                            // <-- blocks
    return 0;
}
