reactivex 4.1.0__py3-none-any.whl → 5.0.0a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. reactivex/__init__.py +35 -39
  2. reactivex/_version.py +1 -1
  3. reactivex/abc/disposable.py +3 -4
  4. reactivex/abc/observable.py +13 -6
  5. reactivex/abc/observer.py +2 -1
  6. reactivex/abc/periodicscheduler.py +7 -6
  7. reactivex/abc/scheduler.py +10 -9
  8. reactivex/abc/subject.py +5 -5
  9. reactivex/disposable/compositedisposable.py +4 -4
  10. reactivex/disposable/disposable.py +1 -2
  11. reactivex/disposable/multipleassignmentdisposable.py +2 -3
  12. reactivex/disposable/refcountdisposable.py +1 -2
  13. reactivex/disposable/serialdisposable.py +4 -5
  14. reactivex/disposable/singleassignmentdisposable.py +3 -4
  15. reactivex/internal/__init__.py +2 -0
  16. reactivex/internal/basic.py +2 -2
  17. reactivex/internal/concurrency.py +2 -1
  18. reactivex/internal/curry.py +59 -0
  19. reactivex/internal/exceptions.py +7 -12
  20. reactivex/internal/priorityqueue.py +2 -2
  21. reactivex/internal/utils.py +3 -2
  22. reactivex/notification.py +22 -21
  23. reactivex/observable/case.py +5 -6
  24. reactivex/observable/catch.py +3 -2
  25. reactivex/observable/combinelatest.py +4 -5
  26. reactivex/observable/concat.py +3 -2
  27. reactivex/observable/connectableobservable.py +7 -7
  28. reactivex/observable/defer.py +4 -3
  29. reactivex/observable/empty.py +3 -4
  30. reactivex/observable/forkjoin.py +5 -5
  31. reactivex/observable/fromcallback.py +4 -3
  32. reactivex/observable/fromfuture.py +2 -2
  33. reactivex/observable/fromiterable.py +4 -3
  34. reactivex/observable/generate.py +2 -2
  35. reactivex/observable/generatewithrelativetime.py +4 -3
  36. reactivex/observable/groupedobservable.py +4 -4
  37. reactivex/observable/ifthen.py +3 -2
  38. reactivex/observable/interval.py +1 -4
  39. reactivex/observable/marbles.py +18 -17
  40. reactivex/observable/mixins/__init__.py +32 -0
  41. reactivex/observable/mixins/combination.py +481 -0
  42. reactivex/observable/mixins/conditional.py +135 -0
  43. reactivex/observable/mixins/error_handling.py +130 -0
  44. reactivex/observable/mixins/filtering.py +1119 -0
  45. reactivex/observable/mixins/mathematical.py +277 -0
  46. reactivex/observable/mixins/multicasting.py +306 -0
  47. reactivex/observable/mixins/testing.py +193 -0
  48. reactivex/observable/mixins/time_based.py +209 -0
  49. reactivex/observable/mixins/transformation.py +632 -0
  50. reactivex/observable/mixins/utility.py +811 -0
  51. reactivex/observable/mixins/windowing.py +688 -0
  52. reactivex/observable/never.py +2 -2
  53. reactivex/observable/observable.py +72 -25
  54. reactivex/observable/onerrorresumenext.py +7 -6
  55. reactivex/observable/range.py +6 -6
  56. reactivex/observable/repeat.py +2 -2
  57. reactivex/observable/returnvalue.py +6 -5
  58. reactivex/observable/start.py +3 -2
  59. reactivex/observable/startasync.py +2 -1
  60. reactivex/observable/throw.py +3 -3
  61. reactivex/observable/timer.py +12 -12
  62. reactivex/observable/toasync.py +3 -2
  63. reactivex/observable/using.py +5 -4
  64. reactivex/observable/withlatestfrom.py +4 -5
  65. reactivex/observable/zip.py +7 -6
  66. reactivex/observer/autodetachobserver.py +4 -4
  67. reactivex/observer/observer.py +5 -4
  68. reactivex/observer/scheduledobserver.py +2 -2
  69. reactivex/operators/__init__.py +162 -208
  70. reactivex/operators/_all.py +23 -6
  71. reactivex/operators/_amb.py +88 -75
  72. reactivex/operators/_asobservable.py +20 -17
  73. reactivex/operators/_average.py +48 -45
  74. reactivex/operators/_buffer.py +81 -35
  75. reactivex/operators/_bufferwithtime.py +29 -9
  76. reactivex/operators/_bufferwithtimeorcount.py +27 -8
  77. reactivex/operators/_catch.py +33 -32
  78. reactivex/operators/_combinelatest.py +28 -20
  79. reactivex/operators/_concat.py +16 -13
  80. reactivex/operators/_contains.py +25 -6
  81. reactivex/operators/_count.py +24 -8
  82. reactivex/operators/_debounce.py +141 -138
  83. reactivex/operators/_defaultifempty.py +45 -42
  84. reactivex/operators/_delay.py +24 -23
  85. reactivex/operators/_delaysubscription.py +23 -21
  86. reactivex/operators/_delaywithmapper.py +10 -11
  87. reactivex/operators/_dematerialize.py +25 -21
  88. reactivex/operators/_distinct.py +50 -46
  89. reactivex/operators/_distinctuntilchanged.py +60 -57
  90. reactivex/operators/_do.py +123 -116
  91. reactivex/operators/_dowhile.py +3 -2
  92. reactivex/operators/_elementatordefault.py +57 -33
  93. reactivex/operators/_exclusive.py +59 -53
  94. reactivex/operators/_expand.py +82 -77
  95. reactivex/operators/_filter.py +63 -68
  96. reactivex/operators/_finallyaction.py +3 -2
  97. reactivex/operators/_find.py +49 -32
  98. reactivex/operators/_first.py +18 -11
  99. reactivex/operators/_firstordefault.py +5 -4
  100. reactivex/operators/_flatmap.py +89 -83
  101. reactivex/operators/_forkjoin.py +23 -18
  102. reactivex/operators/_groupby.py +27 -6
  103. reactivex/operators/_groupbyuntil.py +8 -5
  104. reactivex/operators/_groupjoin.py +7 -6
  105. reactivex/operators/_ignoreelements.py +20 -15
  106. reactivex/operators/_isempty.py +15 -4
  107. reactivex/operators/_join.py +6 -5
  108. reactivex/operators/_last.py +36 -31
  109. reactivex/operators/_lastordefault.py +8 -8
  110. reactivex/operators/_map.py +54 -39
  111. reactivex/operators/_materialize.py +30 -31
  112. reactivex/operators/_max.py +18 -11
  113. reactivex/operators/_maxby.py +5 -5
  114. reactivex/operators/_merge.py +132 -129
  115. reactivex/operators/_min.py +16 -10
  116. reactivex/operators/_minby.py +9 -8
  117. reactivex/operators/_multicast.py +9 -9
  118. reactivex/operators/_observeon.py +35 -31
  119. reactivex/operators/_onerrorresumenext.py +2 -1
  120. reactivex/operators/_pairwise.py +38 -34
  121. reactivex/operators/_partition.py +80 -73
  122. reactivex/operators/_pluck.py +4 -3
  123. reactivex/operators/_publish.py +36 -21
  124. reactivex/operators/_publishvalue.py +8 -7
  125. reactivex/operators/_reduce.py +16 -12
  126. reactivex/operators/_repeat.py +33 -30
  127. reactivex/operators/_replay.py +9 -9
  128. reactivex/operators/_retry.py +12 -10
  129. reactivex/operators/_sample.py +31 -27
  130. reactivex/operators/_scan.py +41 -39
  131. reactivex/operators/_sequenceequal.py +8 -7
  132. reactivex/operators/_single.py +20 -13
  133. reactivex/operators/_singleordefault.py +6 -5
  134. reactivex/operators/_skip.py +35 -32
  135. reactivex/operators/_skiplast.py +38 -34
  136. reactivex/operators/_skiplastwithtime.py +5 -4
  137. reactivex/operators/_skipuntil.py +40 -35
  138. reactivex/operators/_skipuntilwithtime.py +4 -3
  139. reactivex/operators/_skipwhile.py +65 -44
  140. reactivex/operators/_skipwithtime.py +50 -46
  141. reactivex/operators/_slice.py +58 -53
  142. reactivex/operators/_some.py +48 -47
  143. reactivex/operators/_startswith.py +17 -15
  144. reactivex/operators/_subscribeon.py +44 -41
  145. reactivex/operators/_sum.py +23 -6
  146. reactivex/operators/_switchlatest.py +71 -69
  147. reactivex/operators/_take.py +37 -33
  148. reactivex/operators/_takelast.py +37 -36
  149. reactivex/operators/_takelastbuffer.py +38 -37
  150. reactivex/operators/_takelastwithtime.py +60 -56
  151. reactivex/operators/_takeuntil.py +33 -32
  152. reactivex/operators/_takeuntilwithtime.py +42 -39
  153. reactivex/operators/_takewhile.py +108 -100
  154. reactivex/operators/_takewithtime.py +46 -41
  155. reactivex/operators/_throttlefirst.py +52 -45
  156. reactivex/operators/_timeinterval.py +40 -36
  157. reactivex/operators/_timeout.py +81 -79
  158. reactivex/operators/_timeoutwithmapper.py +6 -5
  159. reactivex/operators/_timestamp.py +24 -22
  160. reactivex/operators/_todict.py +51 -43
  161. reactivex/operators/_tofuture.py +24 -15
  162. reactivex/operators/_toiterable.py +33 -27
  163. reactivex/operators/_tomarbles.py +5 -5
  164. reactivex/operators/_toset.py +29 -19
  165. reactivex/operators/_whiledo.py +2 -1
  166. reactivex/operators/_window.py +100 -99
  167. reactivex/operators/_windowwithcount.py +56 -54
  168. reactivex/operators/_windowwithtime.py +95 -79
  169. reactivex/operators/_windowwithtimeorcount.py +85 -69
  170. reactivex/operators/_withlatestfrom.py +13 -9
  171. reactivex/operators/_zip.py +67 -63
  172. reactivex/operators/connectable/_refcount.py +4 -3
  173. reactivex/pipe.py +2 -1
  174. reactivex/run.py +8 -4
  175. reactivex/scheduler/catchscheduler.py +11 -10
  176. reactivex/scheduler/currentthreadscheduler.py +2 -3
  177. reactivex/scheduler/eventloop/asyncioscheduler.py +7 -6
  178. reactivex/scheduler/eventloop/asynciothreadsafescheduler.py +12 -14
  179. reactivex/scheduler/eventloop/eventletscheduler.py +4 -4
  180. reactivex/scheduler/eventloop/geventscheduler.py +4 -4
  181. reactivex/scheduler/eventloop/ioloopscheduler.py +4 -4
  182. reactivex/scheduler/eventloop/twistedscheduler.py +4 -4
  183. reactivex/scheduler/eventloopscheduler.py +9 -12
  184. reactivex/scheduler/historicalscheduler.py +1 -2
  185. reactivex/scheduler/immediatescheduler.py +5 -4
  186. reactivex/scheduler/mainloop/gtkscheduler.py +6 -7
  187. reactivex/scheduler/mainloop/pygamescheduler.py +4 -4
  188. reactivex/scheduler/mainloop/qtscheduler.py +6 -6
  189. reactivex/scheduler/mainloop/tkinterscheduler.py +4 -4
  190. reactivex/scheduler/mainloop/wxscheduler.py +7 -7
  191. reactivex/scheduler/newthreadscheduler.py +6 -8
  192. reactivex/scheduler/periodicscheduler.py +4 -4
  193. reactivex/scheduler/scheduleditem.py +4 -4
  194. reactivex/scheduler/scheduler.py +5 -5
  195. reactivex/scheduler/threadpoolscheduler.py +3 -3
  196. reactivex/scheduler/timeoutscheduler.py +5 -4
  197. reactivex/scheduler/trampoline.py +1 -2
  198. reactivex/scheduler/trampolinescheduler.py +5 -6
  199. reactivex/scheduler/virtualtimescheduler.py +4 -4
  200. reactivex/subject/asyncsubject.py +2 -2
  201. reactivex/subject/behaviorsubject.py +2 -2
  202. reactivex/subject/innersubscription.py +2 -2
  203. reactivex/subject/replaysubject.py +8 -8
  204. reactivex/subject/subject.py +4 -4
  205. reactivex/testing/coldobservable.py +5 -5
  206. reactivex/testing/hotobservable.py +6 -6
  207. reactivex/testing/marbles.py +21 -20
  208. reactivex/testing/mockdisposable.py +1 -3
  209. reactivex/testing/mockobserver.py +2 -2
  210. reactivex/testing/reactivetest.py +2 -2
  211. reactivex/testing/recorded.py +1 -1
  212. reactivex/testing/subscription.py +3 -3
  213. reactivex/testing/testscheduler.py +13 -12
  214. reactivex/typing.py +25 -14
  215. {reactivex-4.1.0.dist-info → reactivex-5.0.0a2.dist-info}/METADATA +59 -26
  216. reactivex-5.0.0a2.dist-info/RECORD +236 -0
  217. {reactivex-4.1.0.dist-info → reactivex-5.0.0a2.dist-info}/WHEEL +1 -1
  218. reactivex-4.1.0.dist-info/RECORD +0 -223
  219. {reactivex-4.1.0.dist-info → reactivex-5.0.0a2.dist-info}/licenses/LICENSE +0 -0
@@ -1,4 +1,5 @@
1
- from typing import Callable, Optional, TypeVar, Union
1
+ from collections.abc import Callable
2
+ from typing import TypeVar
2
3
 
3
4
  from reactivex import ConnectableObservable, Observable, abc
4
5
  from reactivex import operators as ops
@@ -9,14 +10,13 @@ _TResult = TypeVar("_TResult")
9
10
 
10
11
 
11
12
  def multicast_(
12
- subject: Optional[abc.SubjectBase[_TSource]] = None,
13
+ subject: abc.SubjectBase[_TSource] | None = None,
13
14
  *,
14
- subject_factory: Optional[
15
- Callable[[Optional[abc.SchedulerBase]], abc.SubjectBase[_TSource]]
16
- ] = None,
17
- mapper: Optional[Callable[[Observable[_TSource]], Observable[_TResult]]] = None,
15
+ subject_factory: Callable[[abc.SchedulerBase | None], abc.SubjectBase[_TSource]]
16
+ | None = None,
17
+ mapper: Callable[[Observable[_TSource]], Observable[_TResult]] | None = None,
18
18
  ) -> Callable[
19
- [Observable[_TSource]], Union[Observable[_TResult], ConnectableObservable[_TSource]]
19
+ [Observable[_TSource]], Observable[_TResult] | ConnectableObservable[_TSource]
20
20
  ]:
21
21
  """Multicasts the source sequence notifications through an
22
22
  instantiated subject into all uses of the sequence within a mapper
@@ -50,12 +50,12 @@ def multicast_(
50
50
 
51
51
  def multicast(
52
52
  source: Observable[_TSource],
53
- ) -> Union[Observable[_TResult], ConnectableObservable[_TSource]]:
53
+ ) -> Observable[_TResult] | ConnectableObservable[_TSource]:
54
54
  if subject_factory:
55
55
 
56
56
  def subscribe(
57
57
  observer: abc.ObserverBase[_TResult],
58
- scheduler: Optional[abc.SchedulerBase] = None,
58
+ scheduler: abc.SchedulerBase | None = None,
59
59
  ) -> abc.DisposableBase:
60
60
  assert subject_factory
61
61
  connectable = source.pipe(
@@ -1,43 +1,47 @@
1
- from typing import Callable, Optional, TypeVar
1
+ from typing import TypeVar
2
2
 
3
3
  from reactivex import Observable, abc
4
+ from reactivex.internal import curry_flip
4
5
  from reactivex.observer import ObserveOnObserver
5
6
 
6
7
  _T = TypeVar("_T")
7
8
 
8
9
 
10
+ @curry_flip
9
11
  def observe_on_(
12
+ source: Observable[_T],
10
13
  scheduler: abc.SchedulerBase,
11
- ) -> Callable[[Observable[_T]], Observable[_T]]:
12
- def observe_on(source: Observable[_T]) -> Observable[_T]:
13
- """Wraps the source sequence in order to run its observer
14
- callbacks on the specified scheduler.
15
-
16
- This only invokes observer callbacks on a scheduler. In case
17
- the subscription and/or unsubscription actions have
18
- side-effects that require to be run on a scheduler, use
19
- subscribe_on.
20
-
21
- Args:
22
- source: Source observable.
23
-
24
-
25
- Returns:
26
- Returns the source sequence whose observations happen on
27
- the specified scheduler.
28
- """
29
-
30
- def subscribe(
31
- observer: abc.ObserverBase[_T],
32
- subscribe_scheduler: Optional[abc.SchedulerBase] = None,
33
- ):
34
- return source.subscribe(
35
- ObserveOnObserver(scheduler, observer), scheduler=subscribe_scheduler
36
- )
37
-
38
- return Observable(subscribe)
39
-
40
- return observe_on
14
+ ) -> Observable[_T]:
15
+ """Wraps the source sequence in order to run its observer
16
+ callbacks on the specified scheduler.
17
+
18
+ This only invokes observer callbacks on a scheduler. In case
19
+ the subscription and/or unsubscription actions have
20
+ side-effects that require to be run on a scheduler, use
21
+ subscribe_on.
22
+
23
+ Examples:
24
+ >>> res = source.pipe(observe_on(scheduler))
25
+ >>> res = observe_on(scheduler)(source)
26
+
27
+ Args:
28
+ source: Source observable.
29
+ scheduler: Scheduler to observe on.
30
+
31
+ Returns:
32
+ Returns the source sequence whose observations happen on
33
+ the specified scheduler.
34
+ """
35
+
36
+ def subscribe(
37
+ observer: abc.ObserverBase[_T],
38
+ subscribe_scheduler: abc.SchedulerBase | None = None,
39
+ ):
40
+ return source.subscribe(
41
+ ObserveOnObserver(scheduler, observer), scheduler=subscribe_scheduler
42
+ )
43
+
44
+ return Observable(subscribe)
41
45
 
42
46
 
43
47
  __all__ = ["observe_on_"]
@@ -1,4 +1,5 @@
1
- from typing import Callable, TypeVar
1
+ from collections.abc import Callable
2
+ from typing import TypeVar
2
3
 
3
4
  import reactivex
4
5
  from reactivex import Observable
@@ -1,53 +1,57 @@
1
- from typing import Callable, Optional, Tuple, TypeVar, cast
1
+ from typing import TypeVar, cast
2
2
 
3
3
  from reactivex import Observable, abc
4
+ from reactivex.internal import curry_flip
4
5
 
5
6
  _T = TypeVar("_T")
6
7
 
7
8
 
8
- def pairwise_() -> Callable[[Observable[_T]], Observable[Tuple[_T, _T]]]:
9
- def pairwise(source: Observable[_T]) -> Observable[Tuple[_T, _T]]:
10
- """Partially applied pairwise operator.
9
+ @curry_flip
10
+ def pairwise_(source: Observable[_T]) -> Observable[tuple[_T, _T]]:
11
+ """Returns a new observable that triggers on the second and
12
+ subsequent triggerings of the input observable. The Nth
13
+ triggering of the input observable passes the arguments from
14
+ the N-1th and Nth triggering as a pair. The argument passed to
15
+ the N-1th triggering is held in hidden internal state until the
16
+ Nth triggering occurs.
11
17
 
12
- Returns a new observable that triggers on the second and
13
- subsequent triggerings of the input observable. The Nth
14
- triggering of the input observable passes the arguments from
15
- the N-1th and Nth triggering as a pair. The argument passed to
16
- the N-1th triggering is held in hidden internal state until the
17
- Nth triggering occurs.
18
+ Examples:
19
+ >>> res = source.pipe(pairwise())
20
+ >>> res = pairwise()(source)
18
21
 
19
- Returns:
20
- An observable that triggers on successive pairs of
21
- observations from the input observable as an array.
22
- """
22
+ Args:
23
+ source: The source observable sequence.
23
24
 
24
- def subscribe(
25
- observer: abc.ObserverBase[Tuple[_T, _T]],
26
- scheduler: Optional[abc.SchedulerBase] = None,
27
- ) -> abc.DisposableBase:
28
- has_previous = False
29
- previous: _T = cast(_T, None)
25
+ Returns:
26
+ An observable that triggers on successive pairs of
27
+ observations from the input observable as an array.
28
+ """
30
29
 
31
- def on_next(x: _T) -> None:
32
- nonlocal has_previous, previous
33
- pair = None
30
+ def subscribe(
31
+ observer: abc.ObserverBase[tuple[_T, _T]],
32
+ scheduler: abc.SchedulerBase | None = None,
33
+ ) -> abc.DisposableBase:
34
+ has_previous = False
35
+ previous: _T = cast(_T, None)
34
36
 
35
- with source.lock:
36
- if has_previous:
37
- pair = (previous, x)
38
- else:
39
- has_previous = True
37
+ def on_next(x: _T) -> None:
38
+ nonlocal has_previous, previous
39
+ pair = None
40
40
 
41
- previous = x
41
+ with source.lock:
42
+ if has_previous:
43
+ pair = (previous, x)
44
+ else:
45
+ has_previous = True
42
46
 
43
- if pair:
44
- observer.on_next(pair)
47
+ previous = x
45
48
 
46
- return source.subscribe(on_next, observer.on_error, observer.on_completed)
49
+ if pair:
50
+ observer.on_next(pair)
47
51
 
48
- return Observable(subscribe)
52
+ return source.subscribe(on_next, observer.on_error, observer.on_completed)
49
53
 
50
- return pairwise
54
+ return Observable(subscribe)
51
55
 
52
56
 
53
57
  __all__ = ["pairwise_"]
@@ -1,88 +1,95 @@
1
- from typing import Callable, List, TypeVar
1
+ from typing import TypeVar
2
2
 
3
3
  from reactivex import Observable
4
4
  from reactivex import operators as ops
5
+ from reactivex.internal import curry_flip
5
6
  from reactivex.typing import Predicate, PredicateIndexed
6
7
 
7
8
  _T = TypeVar("_T")
8
9
 
9
10
 
11
+ @curry_flip
10
12
  def partition_(
13
+ source: Observable[_T],
11
14
  predicate: Predicate[_T],
12
- ) -> Callable[[Observable[_T]], List[Observable[_T]]]:
13
- def partition(source: Observable[_T]) -> List[Observable[_T]]:
14
- """The partially applied `partition` operator.
15
-
16
- Returns two observables which partition the observations of the
17
- source by the given function. The first will trigger
18
- observations for those values for which the predicate returns
19
- true. The second will trigger observations for those values
20
- where the predicate returns false. The predicate is executed
21
- once for each subscribed observer. Both also propagate all
22
- error observations arising from the source and each completes
23
- when the source completes.
24
-
25
- Args:
26
- source: Source observable to partition.
27
-
28
- Returns:
29
- A list of observables. The first triggers when the
30
- predicate returns True, and the second triggers when the
31
- predicate returns False.
32
- """
33
-
34
- def not_predicate(x: _T) -> bool:
35
- return not predicate(x)
36
-
37
- published = source.pipe(
38
- ops.publish(),
39
- ops.ref_count(),
40
- )
41
- return [
42
- published.pipe(ops.filter(predicate)),
43
- published.pipe(ops.filter(not_predicate)),
44
- ]
45
-
46
- return partition
47
-
48
-
15
+ ) -> list[Observable[_T]]:
16
+ """Returns two observables which partition the observations of the
17
+ source by the given function.
18
+
19
+ The first will trigger observations for those values for which the
20
+ predicate returns true. The second will trigger observations for
21
+ those values where the predicate returns false. The predicate is
22
+ executed once for each subscribed observer. Both also propagate all
23
+ error observations arising from the source and each completes
24
+ when the source completes.
25
+
26
+ Examples:
27
+ >>> res = source.pipe(partition(lambda x: x > 5))
28
+ >>> res = partition(lambda x: x > 5)(source)
29
+
30
+ Args:
31
+ source: Source observable to partition.
32
+ predicate: Function to test each element.
33
+
34
+ Returns:
35
+ A list of observables. The first triggers when the
36
+ predicate returns True, and the second triggers when the
37
+ predicate returns False.
38
+ """
39
+
40
+ def not_predicate(x: _T) -> bool:
41
+ return not predicate(x)
42
+
43
+ published = source.pipe(
44
+ ops.publish(),
45
+ ops.ref_count(),
46
+ )
47
+ return [
48
+ published.pipe(ops.filter(predicate)),
49
+ published.pipe(ops.filter(not_predicate)),
50
+ ]
51
+
52
+
53
+ @curry_flip
49
54
  def partition_indexed_(
55
+ source: Observable[_T],
50
56
  predicate_indexed: PredicateIndexed[_T],
51
- ) -> Callable[[Observable[_T]], List[Observable[_T]]]:
52
- def partition_indexed(source: Observable[_T]) -> List[Observable[_T]]:
53
- """The partially applied indexed partition operator.
54
-
55
- Returns two observables which partition the observations of the
56
- source by the given function. The first will trigger
57
- observations for those values for which the predicate returns
58
- true. The second will trigger observations for those values
59
- where the predicate returns false. The predicate is executed
60
- once for each subscribed observer. Both also propagate all
61
- error observations arising from the source and each completes
62
- when the source completes.
63
-
64
- Args:
65
- source: Source observable to partition.
66
-
67
- Returns:
68
- A list of observables. The first triggers when the
69
- predicate returns True, and the second triggers when the
70
- predicate returns False.
71
- """
72
-
73
- def not_predicate_indexed(x: _T, i: int) -> bool:
74
- return not predicate_indexed(x, i)
75
-
76
- published = source.pipe(
77
- ops.publish(),
78
- ops.ref_count(),
79
- )
80
- return [
81
- published.pipe(ops.filter_indexed(predicate_indexed)),
82
- published.pipe(ops.filter_indexed(not_predicate_indexed)),
83
- ]
84
-
85
- return partition_indexed
57
+ ) -> list[Observable[_T]]:
58
+ """Returns two observables which partition the observations of the
59
+ source by the given indexed function.
60
+
61
+ The first will trigger observations for those values for which the
62
+ predicate returns true. The second will trigger observations for
63
+ those values where the predicate returns false. The predicate is
64
+ executed once for each subscribed observer. Both also propagate all
65
+ error observations arising from the source and each completes
66
+ when the source completes.
67
+
68
+ Examples:
69
+ >>> res = source.pipe(partition_indexed(lambda x, i: i % 2 == 0))
70
+ >>> res = partition_indexed(lambda x, i: i % 2 == 0)(source)
71
+
72
+ Args:
73
+ source: Source observable to partition.
74
+ predicate_indexed: Function to test each element with its index.
75
+
76
+ Returns:
77
+ A list of observables. The first triggers when the
78
+ predicate returns True, and the second triggers when the
79
+ predicate returns False.
80
+ """
81
+
82
+ def not_predicate_indexed(x: _T, i: int) -> bool:
83
+ return not predicate_indexed(x, i)
84
+
85
+ published = source.pipe(
86
+ ops.publish(),
87
+ ops.ref_count(),
88
+ )
89
+ return [
90
+ published.pipe(ops.filter_indexed(predicate_indexed)),
91
+ published.pipe(ops.filter_indexed(not_predicate_indexed)),
92
+ ]
86
93
 
87
94
 
88
95
  __all__ = ["partition_", "partition_indexed_"]
@@ -1,4 +1,5 @@
1
- from typing import Any, Callable, Dict, TypeVar
1
+ from collections.abc import Callable
2
+ from typing import Any, TypeVar
2
3
 
3
4
  from reactivex import Observable
4
5
  from reactivex import operators as ops
@@ -9,7 +10,7 @@ _TValue = TypeVar("_TValue")
9
10
 
10
11
  def pluck_(
11
12
  key: _TKey,
12
- ) -> Callable[[Observable[Dict[_TKey, _TValue]]], Observable[_TValue]]:
13
+ ) -> Callable[[Observable[dict[_TKey, _TValue]]], Observable[_TValue]]:
13
14
  """Retrieves the value of a specified key using dict-like access (as in
14
15
  element[key]) from all elements in the Observable sequence.
15
16
 
@@ -21,7 +22,7 @@ def pluck_(
21
22
  To pluck an attribute of each element, use pluck_attr.
22
23
  """
23
24
 
24
- def mapper(x: Dict[_TKey, _TValue]) -> _TValue:
25
+ def mapper(x: dict[_TKey, _TValue]) -> _TValue:
25
26
  return x[key]
26
27
 
27
28
  return ops.map(mapper)
@@ -1,7 +1,8 @@
1
- from typing import Callable, Optional, TypeVar, Union
1
+ from typing import TypeVar
2
2
 
3
3
  from reactivex import ConnectableObservable, Observable, abc, compose
4
4
  from reactivex import operators as ops
5
+ from reactivex.internal import curry_flip
5
6
  from reactivex.subject import Subject
6
7
  from reactivex.typing import Mapper
7
8
 
@@ -9,25 +10,26 @@ _TSource = TypeVar("_TSource")
9
10
  _TResult = TypeVar("_TResult")
10
11
 
11
12
 
13
+ @curry_flip
12
14
  def publish_(
13
- mapper: Optional[Mapper[Observable[_TSource], Observable[_TResult]]] = None,
14
- ) -> Callable[
15
- [Observable[_TSource]], Union[Observable[_TResult], ConnectableObservable[_TSource]]
16
- ]:
15
+ source: Observable[_TSource],
16
+ mapper: Mapper[Observable[_TSource], Observable[_TResult]] | None = None,
17
+ ) -> Observable[_TResult] | ConnectableObservable[_TSource]:
17
18
  """Returns an observable sequence that is the result of invoking the
18
19
  mapper on a connectable observable sequence that shares a single
19
20
  subscription to the underlying sequence. This operator is a
20
21
  specialization of Multicast using a regular Subject.
21
22
 
22
- Example:
23
- >>> res = publish()
24
- >>> res = publish(lambda x: x)
23
+ Examples:
24
+ >>> source.pipe(publish())
25
+ >>> source.pipe(publish(lambda x: x))
26
+ >>> publish()(source)
25
27
 
26
- mapper: [Optional] Selector function which can use the
27
- multicasted source sequence as many times as needed, without causing
28
- multiple subscriptions to the source sequence. Subscribers to the
29
- given source will receive all notifications of the source from the
30
- time of the subscription on.
28
+ Args:
29
+ source: Source observable to publish.
30
+ mapper: [Optional] Selector function which can use the
31
+ multicasted source sequence as many times as needed, without
32
+ causing multiple subscriptions to the source sequence.
31
33
 
32
34
  Returns:
33
35
  An observable sequence that contains the elements of a sequence
@@ -37,17 +39,18 @@ def publish_(
37
39
 
38
40
  if mapper:
39
41
 
40
- def factory(scheduler: Optional[abc.SchedulerBase] = None) -> Subject[_TSource]:
42
+ def factory(scheduler: abc.SchedulerBase | None = None) -> Subject[_TSource]:
41
43
  return Subject()
42
44
 
43
- return ops.multicast(subject_factory=factory, mapper=mapper)
45
+ return source.pipe(ops.multicast(subject_factory=factory, mapper=mapper))
44
46
 
45
47
  subject: Subject[_TSource] = Subject()
46
- return ops.multicast(subject=subject)
48
+ return source.pipe(ops.multicast(subject=subject))
47
49
 
48
50
 
49
- def share_() -> Callable[[Observable[_TSource]], Observable[_TSource]]:
50
- """Share a single subscription among multple observers.
51
+ @curry_flip
52
+ def share_(source: Observable[_TSource]) -> Observable[_TSource]:
53
+ """Share a single subscription among multiple observers.
51
54
 
52
55
  Returns a new Observable that multicasts (shares) the original
53
56
  Observable. As long as there is at least one Subscriber this
@@ -56,10 +59,22 @@ def share_() -> Callable[[Observable[_TSource]], Observable[_TSource]]:
56
59
  Observable.
57
60
 
58
61
  This is an alias for a composed publish() and ref_count().
62
+
63
+ Examples:
64
+ >>> source.pipe(share())
65
+ >>> share()(source)
66
+
67
+ Args:
68
+ source: Source observable to share.
69
+
70
+ Returns:
71
+ An observable that shares a single subscription.
59
72
  """
60
- return compose(
61
- ops.publish(),
62
- ops.ref_count(),
73
+ return source.pipe(
74
+ compose(
75
+ ops.publish(),
76
+ ops.ref_count(),
77
+ )
63
78
  )
64
79
 
65
80
 
@@ -1,4 +1,5 @@
1
- from typing import Callable, Optional, TypeVar, Union
1
+ from collections.abc import Callable
2
+ from typing import TypeVar
2
3
 
3
4
  from reactivex import ConnectableObservable, Observable, abc
4
5
  from reactivex import operators as ops
@@ -11,15 +12,15 @@ _T2 = TypeVar("_T2")
11
12
 
12
13
  def publish_value_(
13
14
  initial_value: _T1,
14
- mapper: Optional[Mapper[Observable[_T1], Observable[_T2]]] = None,
15
- ) -> Union[
16
- Callable[[Observable[_T1]], ConnectableObservable[_T1]],
17
- Callable[[Observable[_T1]], Observable[_T2]],
18
- ]:
15
+ mapper: Mapper[Observable[_T1], Observable[_T2]] | None = None,
16
+ ) -> (
17
+ Callable[[Observable[_T1]], ConnectableObservable[_T1]]
18
+ | Callable[[Observable[_T1]], Observable[_T2]]
19
+ ):
19
20
  if mapper:
20
21
 
21
22
  def subject_factory(
22
- scheduler: Optional[abc.SchedulerBase] = None,
23
+ scheduler: abc.SchedulerBase | None = None,
23
24
  ) -> BehaviorSubject[_T1]:
24
25
  return BehaviorSubject(initial_value)
25
26
 
@@ -1,7 +1,8 @@
1
- from typing import Any, Callable, Type, TypeVar, Union, cast
1
+ from typing import Any, TypeVar, cast
2
2
 
3
- from reactivex import Observable, compose
3
+ from reactivex import Observable
4
4
  from reactivex import operators as ops
5
+ from reactivex.internal import curry_flip
5
6
  from reactivex.internal.utils import NotSet
6
7
  from reactivex.typing import Accumulator
7
8
 
@@ -9,9 +10,12 @@ _T = TypeVar("_T")
9
10
  _TState = TypeVar("_TState")
10
11
 
11
12
 
13
+ @curry_flip
12
14
  def reduce_(
13
- accumulator: Accumulator[_TState, _T], seed: Union[_TState, Type[NotSet]] = NotSet
14
- ) -> Callable[[Observable[_T]], Observable[Any]]:
15
+ source: Observable[_T],
16
+ accumulator: Accumulator[_TState, _T],
17
+ seed: _TState | type[NotSet] = NotSet,
18
+ ) -> Observable[Any]:
15
19
  """Applies an accumulator function over an observable sequence,
16
20
  returning the result of the aggregation as a single element in the
17
21
  result sequence. The specified seed value is used as the initial
@@ -21,28 +25,28 @@ def reduce_(
21
25
  `scan()`.
22
26
 
23
27
  Examples:
24
- >>> res = reduce(lambda acc, x: acc + x)
25
- >>> res = reduce(lambda acc, x: acc + x, 0)
28
+ >>> result = source.pipe(reduce(lambda acc, x: acc + x))
29
+ >>> result = reduce(lambda acc, x: acc + x)(source)
30
+ >>> result = source.pipe(reduce(lambda acc, x: acc + x, 0))
26
31
 
27
32
  Args:
28
- accumulator: An accumulator function to be
29
- invoked on each element.
33
+ source: The source observable.
34
+ accumulator: An accumulator function to be invoked on each element.
30
35
  seed: Optional initial accumulator value.
31
36
 
32
37
  Returns:
33
- An operator function that takes an observable source and returns
34
- an observable sequence containing a single element with the
38
+ An observable sequence containing a single element with the
35
39
  final accumulator value.
36
40
  """
37
41
  if seed is not NotSet:
38
42
  seed_: _TState = cast(_TState, seed)
39
43
  scanner = ops.scan(accumulator, seed=seed_)
40
- return compose(
44
+ return source.pipe(
41
45
  scanner,
42
46
  ops.last_or_default(default_value=seed_),
43
47
  )
44
48
 
45
- return compose(
49
+ return source.pipe(
46
50
  ops.scan(cast(Accumulator[_T, _T], accumulator)),
47
51
  ops.last(),
48
52
  )