#pragma once
#include "LoopImpl.h"

namespace panda { namespace unievent { namespace backend {

struct IWorkImplListener {
    virtual void handle_work       () = 0;
    virtual void handle_after_work (const std::error_code&) = 0;
};

struct WorkImpl {
    LoopImpl*          loop;
    IWorkImplListener* listener;

    WorkImpl (LoopImpl* loop, IWorkImplListener* lst) : loop(loop), listener(lst) { panda_log_ctor(); }

    virtual void queue () = 0;

    void handle_work () noexcept {
        loop->ltry([&]{ listener->handle_work(); });
    }

    void handle_after_work (const std::error_code& err) noexcept {
        loop->ltry([&]{ listener->handle_after_work(err); });
    }

    virtual bool destroy () noexcept = 0;

    virtual ~WorkImpl () { panda_log_dtor(); }
};

}}}
