Beispiel #1
0
      def onNext(self, value):
        s = Subject()
        resourceId = 0

        with self.parent.gate:
          self.parent.leftID += 1
          resourceId = self.parent.leftID
          self.parent.leftMap[resourceId] = s

        # AddRef was originally WindowObservable but this is just an alias for AddRef
        window = AddRef(s, self.parent.refCount)
        md = SingleAssignmentDisposable()
        self.parent.group.add(md)

        try:
          duration = self.parent.parent.leftDurationSelector(value)
        except Exception as e:
          self.onError(e)
          return
        else:
          md.disposable = duration.subscribeSafe(self.Delta(self, resourceId, s, md))

        try:
          result = self.parent.parent.resultSelector(value, window)
        except Exception as e:
          self.onError(e)
          return
        else:
          with self.parent.gate:
            self.parent.observer.onNext(result)

            for rightValue in self.parent.rightMap.values():
              s.onNext(rightValue)
Beispiel #2
0
            def onNext(self, value):
                s = Subject()
                resourceId = 0

                with self.parent.gate:
                    self.parent.leftID += 1
                    resourceId = self.parent.leftID
                    self.parent.leftMap[resourceId] = s

                # AddRef was originally WindowObservable but this is just an alias for AddRef
                window = AddRef(s, self.parent.refCount)
                md = SingleAssignmentDisposable()
                self.parent.group.add(md)

                try:
                    duration = self.parent.parent.leftDurationSelector(value)
                except Exception as e:
                    self.onError(e)
                    return
                else:
                    md.disposable = duration.subscribeSafe(
                        self.Delta(self, resourceId, s, md))

                try:
                    result = self.parent.parent.resultSelector(value, window)
                except Exception as e:
                    self.onError(e)
                    return
                else:
                    with self.parent.gate:
                        self.parent.observer.onNext(result)

                        for rightValue in self.parent.rightMap.values():
                            s.onNext(rightValue)
Beispiel #3
0
    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:
          with self.nullGate:
            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)

        duration = None
        durationGroup = GroupObservable(key, writer)

        try:
          duration = self.parent.durationSelector(durationGroup)
        except Exception as e:
          self.onError(e)
          return

        with self.observerGate:
          self.observer.onNext(group)

        md = SingleAssignmentDisposable()
        self.parent.groupDisposable.add(md)
        md.disposable = duration.subscribeSafe(self.Delta(self, key, writer, md))

      element = None

      try:
        element = self.parent.elementSelector(value)
      except Exception as e:
        self.onError(e)
      else:
        with self.writerGate:
          writer.onNext(element)
Beispiel #4
0
        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)
Beispiel #5
0
    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)
Beispiel #6
0
  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()
Beispiel #7
0
        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:
                    with self.nullGate:
                        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)

                duration = None
                durationGroup = GroupObservable(key, writer)

                try:
                    duration = self.parent.durationSelector(durationGroup)
                except Exception as e:
                    self.onError(e)
                    return

                with self.observerGate:
                    self.observer.onNext(group)

                md = SingleAssignmentDisposable()
                self.parent.groupDisposable.add(md)
                md.disposable = duration.subscribeSafe(
                    self.Delta(self, key, writer, md))

            element = None

            try:
                element = self.parent.elementSelector(value)
            except Exception as e:
                self.onError(e)
            else:
                with self.writerGate:
                    writer.onNext(element)
Beispiel #8
0
    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()