/// module rxd.rx.scheduling_interfaces; import rxd.meta2.traits; /// struct ScheduleToken(Scheduler) if (isFuncLike!(typeof(Scheduler.cancel), bool function(size_t))) { Scheduler.WeakRefOf scheduler; size_t idx; /// bool cancel() { return scheduler && scheduler.cancel(idx); } } /// interface IScheduler { import core.time : MonoTime; alias WeakRefOf = typeof(this); alias Token = ScheduleToken!IScheduler; alias CallbackFn(Input) = ScheduleToken function(IScheduler, Input); alias CallbackDg(Input) = ScheduleToken delegate(IScheduler, Input); /// MonoTime now(); /// Token schedule(Input)(Input input, Duration timeout, CallbackFn!S action); /// Token schedule(Input)(Input input, Duration timeout, CallbackDg!S action); /// bool cancel(size_t idx); }