#pragma once namespace Components { class Scheduler : public Component { public: typedef void(Callback)(); Scheduler(); ~Scheduler(); static void OnShutdown(Utils::Slot callback); static void OnFrame(Utils::Slot callback); static void OnReady(Utils::Slot callback); static void Once(Utils::Slot callback); static void OnDelay(Utils::Slot callback, std::chrono::nanoseconds delay); static void FrameHandler(); private: class DelayedSlot { public: std::chrono::nanoseconds delay; Utils::Time::Interval interval; Utils::Slot callback; }; static Utils::Signal FrameSignal; static Utils::Signal FrameOnceSignal; static std::vector DelayedSlots; static bool ReadyPassed; static Utils::Signal ReadySignal; static Utils::Signal ShutdownSignal; static void ReadyHandler(); static void DelaySignal(); }; }