class SinkWithTimeSpan(rx.linq.sink.Sink): def __init__(self, parent, observer, cancel): super(Window.SinkWithTimeSpan, self).__init__(observer, cancel) self.parent = parent def run(self): self.gate = RLock() groupDisposable = CompositeDisposable() self.refCountDisposable = RefCountDisposable(groupDisposable) self.createWindow() groupDisposable.add( self.parent.scheduler.schedulePeriodic(self.parent.timeSpan, self.tick)) groupDisposable.add(self.parent.source.subscribeSafe(self)) return self.refCountDisposable def tick(self): with self.gate: self.subject.onCompleted() self.createWindow() def createWindow(self): self.subject = Subject() self.observer.onNext(AddRef(self.subject, self.refCountDisposable)) def onNext(self, value): with self.gate: self.list.append(value) def onError(self, exception): with self.gate: self.subject.onError(exception) self.observer.onError(exception) self.dispose() def onCompleted(self): with self.gate: self.subject.onCompleted() self.observer.onCompleted() self.dispose()
class SinkWithTimeSpan(rx.linq.sink.Sink): def __init__(self, parent, observer, cancel): super(Window.SinkWithTimeSpan, self).__init__(observer, cancel) self.parent = parent def run(self): self.gate = RLock() groupDisposable = CompositeDisposable() self.refCountDisposable = RefCountDisposable(groupDisposable) self.createWindow() groupDisposable.add(self.parent.scheduler.schedulePeriodic(self.parent.timeSpan, self.tick)) groupDisposable.add(self.parent.source.subscribeSafe(self)) return self.refCountDisposable def tick(self): with self.gate: self.subject.onCompleted() self.createWindow() def createWindow(self): self.subject = Subject() self.observer.onNext(AddRef(self.subject, self.refCountDisposable)) def onNext(self, value): with self.gate: self.list.append(value) def onError(self, exception): with self.gate: self.subject.onError(exception) self.observer.onError(exception) self.dispose() def onCompleted(self): with self.gate: self.subject.onCompleted() self.observer.onCompleted() self.dispose()
class Sink(rx.linq.sink.Sink): def __init__(self, parent, observer, cancel): super(GroupBy.Sink, self).__init__(observer, cancel) self.parent = parent self.map = {} self.null = None def onNext(self, value): key = None try: key = self.parent.keySelector(value) except Exception as e: self.onError(e) return fireNewMapEntry = False writer = None try: if key == None: if self.null == None: self.null = Subject() fireNewMapEntry = True writer = self.null else: if key in self.map: writer = self.map[key] else: writer = Subject() self.map[key] = writer fireNewMapEntry = True except Exception as e: self.onError(e) return if fireNewMapEntry: group = GroupObservable(key, writer, self.parent.refCountDisposable) self.observer.onNext(group) element = None try: element = self.parent.elementSelector(value) except Exception as e: self.onError(e) else: writer.onNext(element) def onError(self, exception): if self.null != None: self.null.onError(exception) for x in self.map.values(): x.onError(exception) self.observer.onError(exception) self.dispose() def onCompleted(self): if self.null != None: self.null.onCompleted() for x in self.map.values(): x.onCompleted() self.observer.onCompleted() self.dispose()
class SinkWithCountAndTimeSpan(rx.linq.sink.Sink): def __init__(self, parent, observer, cancel): super(Window.SinkWithCountAndTimeSpan, self).__init__(observer, cancel) self.parent = parent def run(self): self.gate = RLock() self.s = Subject() self.n = 0 self.windowId = 0 self.timerDisposable = SerialDisposable() groupDisposable = CompositeDisposable(self.timerDisposable) self.refCountDisposable = RefCountDisposable(groupDisposable) # AddRef was originally WindowObservable but this is just an alias for AddRef self.observer.onNext(AddRef(self.s, self.refCountDisposable)) self.createTimer(0) groupDisposable.add(self.parent.source.subscribeSafe(self)) return self.refCountDisposable def createTimer(self, wId): m = SingleAssignmentDisposable() self.timerDisposable.disposable = m m.disposable = self.parent.scheduler.scheduleWithRelativeAndState( wId, self.parent.timeSpan, self.tick ) def tick(self, scheduler, wId): d = Disposable.empty() newId = 0 with self.gate: if wId != self.windowId: return d self.n = 0 self.windowId += 1 newId = self.windowId self.s.onCompleted() self.s = Subject() self.observer.onNext(AddRef(self.s, self.refCountDisposable)) self.createTimer(newId) return d def onNext(self, value): newWindow = False newId = 0 with self.gate: self.s.onNext(value) self.n += 1 if self.n == self.parent.count: newWindow = True self.n = 0 self.windowId += 1 newId = self.windowId self.s.onCompleted() self.s = Subject() self.observer.onNext(AddRef(self.s, self.refCountDisposable)) if newWindow: self.createTimer(newId) def onError(self, exception): with self.gate: self.s.onError(exception) self.observer.onError(exception) self.dispose() def onCompleted(self): with self.gate: self.s.onCompleted() self.observer.onCompleted() self.dispose()
class SinkWithCountAndTimeSpan(rx.linq.sink.Sink): def __init__(self, parent, observer, cancel): super(Window.SinkWithCountAndTimeSpan, self).__init__(observer, cancel) self.parent = parent def run(self): self.gate = RLock() self.s = Subject() self.n = 0 self.windowId = 0 self.timerDisposable = SerialDisposable() groupDisposable = CompositeDisposable(self.timerDisposable) self.refCountDisposable = RefCountDisposable(groupDisposable) # AddRef was originally WindowObservable but this is just an alias for AddRef self.observer.onNext(AddRef(self.s, self.refCountDisposable)) self.createTimer(0) groupDisposable.add(self.parent.source.subscribeSafe(self)) return self.refCountDisposable def createTimer(self, wId): m = SingleAssignmentDisposable() self.timerDisposable.disposable = m m.disposable = self.parent.scheduler.scheduleWithRelativeAndState( wId, self.parent.timeSpan, self.tick) def tick(self, scheduler, wId): d = Disposable.empty() newId = 0 with self.gate: if wId != self.windowId: return d self.n = 0 self.windowId += 1 newId = self.windowId self.s.onCompleted() self.s = Subject() self.observer.onNext(AddRef(self.s, self.refCountDisposable)) self.createTimer(newId) return d def onNext(self, value): newWindow = False newId = 0 with self.gate: self.s.onNext(value) self.n += 1 if self.n == self.parent.count: newWindow = True self.n = 0 self.windowId += 1 newId = self.windowId self.s.onCompleted() self.s = Subject() self.observer.onNext( AddRef(self.s, self.refCountDisposable)) if newWindow: self.createTimer(newId) def onError(self, exception): with self.gate: self.s.onError(exception) self.observer.onError(exception) self.dispose() def onCompleted(self): with self.gate: self.s.onCompleted() self.observer.onCompleted() self.dispose()
class Sink(rx.linq.sink.Sink): def __init__(self, parent, observer, cancel): super(GroupBy.Sink, self).__init__(observer, cancel) self.parent = parent self.map = {} self.null = None def onNext(self, value): key = None try: key = self.parent.keySelector(value) except Exception as e: self.onError(e) return fireNewMapEntry = False writer = None try: if key == None: if self.null == None: self.null = Subject() fireNewMapEntry = True writer = self.null else: if key in self.map: writer = self.map[key] else: writer = Subject() self.map[key] = writer fireNewMapEntry = True except Exception as e: self.onError(e) return if fireNewMapEntry: group = GroupObservable(key, writer, self.parent.refCountDisposable) self.observer.onNext(group) element = None try: element = self.parent.elementSelector(value) except Exception as e: self.onError(e) else: writer.onNext(element) def onError(self, exception): if self.null != None: self.null.onError(exception) for x in self.map.values(): x.onError(exception) self.observer.onError(exception) self.dispose() def onCompleted(self): if self.null != None: self.null.onCompleted() for x in self.map.values(): x.onCompleted() self.observer.onCompleted() self.dispose()