Esempio n. 1
0
    def invokeRec(self, scheduler, state):
      time = 0

      if self.hasResult:
        self.observer.onNext(self.result)

      try:
        if self.first:
          self.first = False
        else:
          state = self.parent.iterate(state)

        self.hasResult = self.parent.condition(state)

        if self.hasResult:
          self.result = self.parent.resultSelector(state)
          time = self.parent.timeSelector(state)
      except Exception as e:
        self.observer.onError(e)
        self.dispose()
        return Disposable.empty()

      if not self.hasResult:
        self.observer.onCompleted()
        self.dispose()
        return Disposable.empty()

      return self.parent.scheduler.scheduleWithRelativeAndState(
        state,
        time,
        self.invokeRec
      )
Esempio n. 2
0
        def invokeRec(self, scheduler, state):
            time = 0

            if self.hasResult:
                self.observer.onNext(self.result)

            try:
                if self.first:
                    self.first = False
                else:
                    state = self.parent.iterate(state)

                self.hasResult = self.parent.condition(state)

                if self.hasResult:
                    self.result = self.parent.resultSelector(state)
                    time = self.parent.timeSelector(state)
            except Exception as e:
                self.observer.onError(e)
                self.dispose()
                return Disposable.empty()

            if not self.hasResult:
                self.observer.onCompleted()
                self.dispose()
                return Disposable.empty()

            return self.parent.scheduler.scheduleWithRelativeAndState(
                state, time, self.invokeRec)
Esempio n. 3
0
  def subscribeCore(self, observer):
    old = None
    new = None

    while True:
      old = self.observer.value

      if old is DisposedObserver.instance:
        raise Exception("Object has been disposed")

      if old is DoneObserver.completed:
        observer.onCompleted()
        return Disposable.empty()

      if isinstance(old, DoneObserver):
        observer.onError(old.exception)
        return Disposable.empty()

      if old is NoopObserver.instance:
        new = observer
      else:
        if isinstance(old, ListObserver):
          new = old.add(observer)
        else:
          new = ListObserver((old, observer))

      current = self.observer.compareExchange(new, old)

      if old is current:
        break

    return self.Subscription(self, observer)
Esempio n. 4
0
    def subscribeCore(self, observer):
        old = None
        new = None

        while True:
            old = self.observer.value

            if old is DisposedObserver.instance:
                raise Exception("Object has been disposed")

            if old is DoneObserver.completed:
                observer.onCompleted()
                return Disposable.empty()

            if isinstance(old, DoneObserver):
                observer.onError(old.exception)
                return Disposable.empty()

            if old is NoopObserver.instance:
                new = observer
            else:
                if isinstance(old, ListObserver):
                    new = old.add(observer)
                else:
                    new = ListObserver((old, observer))

            current = self.observer.compareExchange(new, old)

            if old is current:
                break

        return self.Subscription(self, observer)
Esempio n. 5
0
    def subscribeCore(self, observer):
        ex = None
        v = None
        hv = False

        with self.gate:
            errorIfDisposed(self)

            if not self.isStopped:
                self.observers.append(observer)
                return Subject.Subscription(self, observer)

            ex = self.exception
            hv = self.hasValue
            v = self.value

        if ex != None:
            observer.onError(ex)
        elif hv:
            observer.onNext(v)
            observer.onCompleted()
        else:
            observer.onCompleted()

        return Disposable.empty()
Esempio n. 6
0
    def propagate(self, scheduler, currentId):
      with self.gate:
        if self.hasValue and self.resourceId == currentId:
          self.observer.onNext(self.value)
        self.hasValue = False

      return Disposable.empty()
Esempio n. 7
0
    def connect(self, observer):
      #
      # We connect the given observer to the subject first, before performing any kind
      # of initialization which will register an event handler. This is done to ensure
      # we don't have a time gap between adding the handler and connecting the user's
      # subject, e.g. when the ImmediateScheduler is used.
      #
      # [OK] Use of unsafe Subscribe: called on a known subject implementation.
      #
      connection = self.subject.subscribe(observer)

      self.count += 1
      if self.count == 1:
        try:
          self.initialize()
        except Exception as e:
          self.count -= 1
          connection.dispose()

          observer.onError(e)
          return Disposable.empty()

      def dispose():
        connection.dispose()

        with self.parent.gate:
          self.count -=1
          if self.count == 0:
            self.parent.scheduler.schedule(self.removeHandler.dispose)
            self.parent.session = None

      return Disposable.create(dispose)
Esempio n. 8
0
    def scheduled(_, message):
      # time = message[0]
      notification = message[1]

      notification.accept(observer)

      return Disposable.empty()
Esempio n. 9
0
  def subscribeCore(self, observer):
    ex = None
    v = None
    hv = False

    with self.gate:
      errorIfDisposed(self)

      if not self.isStopped:
        self.observers.append(observer)
        return Subject.Subscription(self, observer)

      ex = self.exception
      hv = self.hasValue
      v = self.value

    if ex != None:
      observer.onError(ex)
    elif hv:
      observer.onNext(v)
      observer.onCompleted()
    else:
      observer.onCompleted()

    return Disposable.empty()
Esempio n. 10
0
  def subscribeCore(self, observer):
    d = self._subscribe(observer)

    if d == None:
      return Disposable.empty()
    else:
      return d
Esempio n. 11
0
        def scheduled(_, message):
            # time = message[0]
            notification = message[1]

            notification.accept(observer)

            return Disposable.empty()
Esempio n. 12
0
    def scheduled(_, message):
      # time = message[0]
      notification = message[1]

      for o in list(self.observers):
        notification.accept(o)

      return Disposable.empty()
Esempio n. 13
0
    def scheduled():
        try:
            subject.onNext(action())
            subject.onCompleted()
        except Exception as e:
            subject.onError(e)

        return Disposable.empty()
Esempio n. 14
0
  def scheduledSubscribe(self, scheduler, autoDetachObserver):
    try:
      autoDetachObserver.disposable = self.subscribeCore(autoDetachObserver)
    except Exception as e:
      if not autoDetachObserver.fail(e):
        raise e

    return Disposable.empty()
Esempio n. 15
0
        def scheduled(_, message):
            # time = message[0]
            notification = message[1]

            for o in list(self.observers):
                notification.accept(o)

            return Disposable.empty()
Esempio n. 16
0
  def scheduled():
    try:
      subject.onNext(action())
      subject.onCompleted()
    except Exception as e:
      subject.onError(e)

    return Disposable.empty()
Esempio n. 17
0
    def wrapper(observer):
        a = subscribe(observer)

        if isinstance(a, Disposable):
            return a
        elif callable(a):
            return Disposable.create(a)
        else:
            return Disposable.empty()
Esempio n. 18
0
 def run(self):
   try:
     result = self.parent.eval()
   except Exception as e:
     self.observer.onError(e)
     self.dispose()
     return Disposable.empty()
   else:
     return result.subscribeSafe(self)
Esempio n. 19
0
  def wrapper(observer):
    a = subscribe(observer)

    if isinstance(a, Disposable):
      return a
    elif callable(a):
      return Disposable.create(a)
    else:
      return Disposable.empty()
Esempio n. 20
0
 def run(self):
     try:
         result = self.parent.eval()
     except Exception as e:
         self.observer.onError(e)
         self.dispose()
         return Disposable.empty()
     else:
         return result.subscribeSafe(self)
Esempio n. 21
0
    def schedulerCallback(self, scheduler, state):
        with self.lock:
            if self.isAdded:
                self.group.remove(self.cancel)
            else:
                self.isDone = True

        self.run(state)

        return Disposable.empty()
Esempio n. 22
0
  def schedulerCallback(self, scheduler, state):
    with self.lock:
      if self.isAdded:
        self.group.remove(self.cancel)
      else:
        self.isDone = True

    self.run(state)

    return Disposable.empty()
Esempio n. 23
0
    def timeout(self, scheduler, currentId):
      timerWins = False

      with self.gate:
        self.switched = self.currentId == currentId
        timerWins = self.switched

      if timerWins:
        self.subscription.disposable = self.parent.other.subscribeSafe(self.getForewarder())

      return Disposable.empty()
Esempio n. 24
0
    def tick(self, scheduler, state):
      with self.gate:
        if state.isSpan:
          s = self.queue.popleft()
          s.onCompleted()

        if state.isShift:
          self.createWindow()

      self.createTimer()

      return Disposable.empty()
Esempio n. 25
0
        def timeout(self, scheduler, currentId):
            timerWins = False

            with self.gate:
                self.switched = self.currentId == currentId
                timerWins = self.switched

            if timerWins:
                self.subscription.disposable = self.parent.other.subscribeSafe(
                    self.getForewarder())

            return Disposable.empty()
Esempio n. 26
0
        def tick(self, scheduler, state):
            with self.gate:
                if state.isSpan:
                    s = self.queue.popleft()
                    self.observer.onNext(s)

                if state.isShift:
                    self.createWindow()

            self.createTimer()

            return Disposable.empty()
Esempio n. 27
0
  def subscribeSafe(self, observer):
    if isinstance(self, ObservableBase):
      return self.subscribeCore(observer)
    elif isinstance(self, Producer):
      return self.subscribeRaw(observer, False)

    d = Disposable.empty()

    try:
      d = self.subscribeCore(observer)
    except Exception as e:
      observer.onError(e)

    return d
Esempio n. 28
0
    def run(self):
      source = None
      disposable = Disposable.empty()

      try:
        resource = self.parent.resourceFactory()
        if resource != None:
          disposable = resource

        source = self.parent.observableFactory(resource)
      except Exception as e:
        return CompositeDisposable(Observable.throw(e).subscribeSafe(self), disposable)

      return CompositeDisposable(source.subscribeSafe(self), disposable)
Esempio n. 29
0
        def run(self):
            source = None
            disposable = Disposable.empty()

            try:
                resource = self.parent.resourceFactory()
                if resource != None:
                    disposable = resource

                source = self.parent.observableFactory(resource)
            except Exception as e:
                return CompositeDisposable(
                    Observable.throw(e).subscribeSafe(self), disposable)

            return CompositeDisposable(source.subscribeSafe(self), disposable)
Esempio n. 30
0
    def run(self):
      observable = None
      connectable = None

      try:
        subject = self.parent.subjectSelector()
        connectable = ConnectableObservable(self.parent.source, subject)
        observable = self.parent.selector(connectable)
      except Exception as e:
        self.observer.onError(e)
        self.dispose()
        return Disposable.empty()
      else:
        subscription = observable.subscribeSafe(self)
        connection = connectable.connect()

        return CompositeDisposable(subscription, connection)
Esempio n. 31
0
    def run(self):
      it = None

      try:
        it = iter(self.parent.source)
      except Exception as e:
        self.observer.onError(e)
        self.dispose()
        return Disposable.empty()

      scheduler = self.parent.scheduler
      if scheduler.isLongRunning:
        return scheduler.scheduleLongRunningWithState(it, self.loop)
      else:
        flag = BooleanDisposable()
        scheduler.scheduleRecursiveWithState(Struct(flag=flag, it=it), self.loopRec)
        return flag
Esempio n. 32
0
    def addHandler(self, scheduler, onNext):
      try:
        removeHandler = self.parent.addHandler(onNext)
      except Exception as e:
        self.subject.onError(e)
      else:
        self.removeHandler.disposable = removeHandler

      #
      # We don't propagate the exception to the OnError channel upon Dispose. This is
      # not possible at this stage, because we've already auto-detached in the base
      # class Producer implementation. Even if we would switch the OnError and auto-
      # detach calls, it wouldn't work because the remove handler logic is scheduled
      # on the given scheduler, causing asynchrony. We can't block waiting for the
      # remove handler to run on the scheduler.
      #
      return Disposable.empty()
Esempio n. 33
0
        def run(self):
            observable = None
            connectable = None

            try:
                subject = self.parent.subjectSelector()
                connectable = ConnectableObservable(self.parent.source,
                                                    subject)
                observable = self.parent.selector(connectable)
            except Exception as e:
                self.observer.onError(e)
                self.dispose()
                return Disposable.empty()
            else:
                subscription = observable.subscribeSafe(self)
                connection = connectable.connect()

                return CompositeDisposable(subscription, connection)
Esempio n. 34
0
        def run(self):
            it = None

            try:
                it = iter(self.parent.source)
            except Exception as e:
                self.observer.onError(e)
                self.dispose()
                return Disposable.empty()

            scheduler = self.parent.scheduler
            if scheduler.isLongRunning:
                return scheduler.scheduleLongRunningWithState(it, self.loop)
            else:
                flag = BooleanDisposable()
                scheduler.scheduleRecursiveWithState(Struct(flag=flag, it=it),
                                                     self.loopRec)
                return flag
Esempio n. 35
0
        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

                res = self.list
                self.list = []
                self.observer.onNext(res)

            self.createTimer(newId)

            return d
Esempio n. 36
0
        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
Esempio n. 37
0
    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

        res = self.list
        self.list = []
        self.observer.onNext(res)

      self.createTimer(newId)

      return d
Esempio n. 38
0
    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
Esempio n. 39
0
 def _replace(disposable):
   cancel.disposable = disposable
   return Disposable.empty()
Esempio n. 40
0
 def subscribeCore(self, observer):
   return Disposable.empty()
Esempio n. 41
0
 def scheduledCreate():
     state.source = factory()
     return Disposable.empty()
Esempio n. 42
0
 def scheduledSubscribe():
     state.subscription = state.source.subscribe(state.observer)
     return Disposable.empty()
Esempio n. 43
0
 def invokeAction(scheduler, action):
     action()
     return Disposable.empty()
Esempio n. 44
0
 def scheduledCreate():
   state.source = factory()
   return Disposable.empty()
Esempio n. 45
0
 def scheduledDispose():
   state.subscription.dispose()
   return Disposable.empty()
Esempio n. 46
0
 def invokeAction(scheduler, action):
   action()
   return Disposable.empty()
Esempio n. 47
0
 def subscribeCore(self, observer):
     return Disposable.empty()
Esempio n. 48
0
 def scheduled():
   subscription.disposable = self.run(observer, subscription, assignSink)
   return Disposable.empty()
Esempio n. 49
0
 def __call__(self, _self, _state):
     try:
         return self.action(self.parent._getRecursiveWrapper(_self), _state)
     except Exception as e:
         if not self.parent._handler(e): raise e
         return Disposable.empty()
Esempio n. 50
0
 def scheduledSubscribe():
   state.subscription = state.source.subscribe(state.observer)
   return Disposable.empty()
Esempio n. 51
0
 def __call__(self, _self, _state):
   try:
     return self.action(self.parent._getRecursiveWrapper(_self), _state)
   except Exception as e:
     if not self.parent._handler(e): raise e
     return Disposable.empty()
Esempio n. 52
0
 def _replace(disposable):
     cancel.disposable = disposable
     return Disposable.empty()
Esempio n. 53
0
 def scheduledDispose():
     state.subscription.dispose()
     return Disposable.empty()