فهرست منبع

TimeoutScheduler;

bjorn 9 سال پیش
والد
کامیت
edc5c25532
3فایلهای تغییر یافته به همراه56 افزوده شده و 0 حذف شده
  1. 26 0
      rx.lua
  2. 28 0
      src/schedulers/timeoutscheduler.lua
  3. 2 0
      tools/build.lua

+ 26 - 0
rx.lua

@@ -1764,6 +1764,31 @@ function CooperativeScheduler:isEmpty()
   return not next(self.tasks)
 end
 
+--- @class TimeoutScheduler
+-- @description A scheduler that uses luvit's timer library to schedule events on an event loop.
+local TimeoutScheduler = {}
+TimeoutScheduler.__index = TimeoutScheduler
+TimeoutScheduler.__tostring = util.constant('TimeoutScheduler')
+
+--- Creates a new TimeoutScheduler.
+-- @returns {TimeoutScheduler}
+function TimeoutScheduler.create()
+  return setmetatable({}, TimeoutScheduler)
+end
+
+--- Schedules an action to run at a future point in time.
+-- @arg {function} action - The action to run.
+-- @arg {number=0} delay - The delay, in milliseconds.
+-- @returns {Subscription}
+function TimeoutScheduler:schedule(action, delay)
+  local timer = require 'timer'
+  local subscription
+  local handle = timer.setTimeout(delay, action)
+  return Subscription.create(function()
+    timer.clearTimeout(handle)
+  end)
+end
+
 --- @class Subject
 -- @description Subjects function both as an Observer and as an Observable. Subjects inherit all
 -- Observable functions, including subscribe. Values can also be pushed to the Subject, which will
@@ -2073,6 +2098,7 @@ return {
   Observable = Observable,
   ImmediateScheduler = ImmediateScheduler,
   CooperativeScheduler = CooperativeScheduler,
+  TimeoutScheduler = TimeoutScheduler,
   Subject = Subject,
   AsyncSubject = AsyncSubject,
   BehaviorSubject = BehaviorSubject,

+ 28 - 0
src/schedulers/timeoutscheduler.lua

@@ -0,0 +1,28 @@
+local Subscription = require 'subscription'
+
+--- @class TimeoutScheduler
+-- @description A scheduler that uses luvit's timer library to schedule events on an event loop.
+local TimeoutScheduler = {}
+TimeoutScheduler.__index = TimeoutScheduler
+TimeoutScheduler.__tostring = util.constant('TimeoutScheduler')
+
+--- Creates a new TimeoutScheduler.
+-- @returns {TimeoutScheduler}
+function TimeoutScheduler.create()
+  return setmetatable({}, TimeoutScheduler)
+end
+
+--- Schedules an action to run at a future point in time.
+-- @arg {function} action - The action to run.
+-- @arg {number=0} delay - The delay, in milliseconds.
+-- @returns {Subscription}
+function TimeoutScheduler:schedule(action, delay)
+  local timer = require 'timer'
+  local subscription
+  local handle = timer.setTimeout(delay, action)
+  return Subscription.create(function()
+    timer.clearTimeout(handle)
+  end)
+end
+
+return TimeoutScheduler

+ 2 - 0
tools/build.lua

@@ -59,6 +59,7 @@ local files = {
   'src/operators/zip.lua',
   'src/schedulers/immediatescheduler.lua',
   'src/schedulers/cooperativescheduler.lua',
+  'src/schedulers/timeoutscheduler.lua',
   'src/subjects/subject.lua',
   'src/subjects/asyncsubject.lua',
   'src/subjects/behaviorsubject.lua',
@@ -90,6 +91,7 @@ local footer = [[return {
   Observable = Observable,
   ImmediateScheduler = ImmediateScheduler,
   CooperativeScheduler = CooperativeScheduler,
+  TimeoutScheduler = TimeoutScheduler,
   Subject = Subject,
   AsyncSubject = AsyncSubject,
   BehaviorSubject = BehaviorSubject,