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
@@ -2,23 +2,18 @@
2
2
 
3
3
 
4
4
  from asyncio import Future
5
+ from collections.abc import Callable, Iterable
5
6
  from typing import (
6
7
  TYPE_CHECKING,
7
8
  Any,
8
- Callable,
9
- Dict,
10
- Iterable,
11
- List,
12
- Optional,
13
- Set,
14
- Tuple,
15
- Type,
16
9
  TypeVar,
17
10
  Union,
18
11
  cast,
19
12
  overload,
20
13
  )
21
14
 
15
+ from typing_extensions import TypeVarTuple, Unpack
16
+
22
17
  from reactivex import (
23
18
  ConnectableObservable,
24
19
  GroupedObservable,
@@ -28,7 +23,6 @@ from reactivex import (
28
23
  compose,
29
24
  typing,
30
25
  )
31
- from reactivex.internal.basic import identity
32
26
  from reactivex.internal.utils import NotSet
33
27
  from reactivex.subject import Subject
34
28
  from reactivex.typing import (
@@ -49,10 +43,7 @@ _TValue = TypeVar("_TValue")
49
43
  _TRight = TypeVar("_TRight")
50
44
  _TLeft = TypeVar("_TLeft")
51
45
 
52
- _A = TypeVar("_A")
53
- _B = TypeVar("_B")
54
- _C = TypeVar("_C")
55
- _D = TypeVar("_D")
46
+ _Ts = TypeVarTuple("_Ts")
56
47
 
57
48
 
58
49
  def all(predicate: Predicate[_T]) -> Callable[[Observable[_T]], Observable[bool]]:
@@ -122,7 +113,7 @@ def as_observable() -> Callable[[Observable[_T]], Observable[_T]]:
122
113
 
123
114
 
124
115
  def average(
125
- key_mapper: Optional[Mapper[_T, float]] = None,
116
+ key_mapper: Mapper[_T, float] | None = None,
126
117
  ) -> Callable[[Observable[_T]], Observable[float]]:
127
118
  """The average operator.
128
119
 
@@ -156,7 +147,7 @@ def average(
156
147
 
157
148
  def buffer(
158
149
  boundaries: Observable[Any],
159
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
150
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
160
151
  """Projects each element of an observable sequence into zero or
161
152
  more buffers.
162
153
 
@@ -186,7 +177,7 @@ def buffer(
186
177
 
187
178
  def buffer_when(
188
179
  closing_mapper: Callable[[], Observable[Any]],
189
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
180
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
190
181
  """Projects each element of an observable sequence into zero or
191
182
  more buffers.
192
183
 
@@ -220,7 +211,7 @@ def buffer_when(
220
211
 
221
212
  def buffer_toggle(
222
213
  openings: Observable[Any], closing_mapper: Callable[[Any], Observable[Any]]
223
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
214
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
224
215
  """Projects each element of an observable sequence into zero or
225
216
  more buffers.
226
217
 
@@ -255,8 +246,8 @@ def buffer_toggle(
255
246
 
256
247
 
257
248
  def buffer_with_count(
258
- count: int, skip: Optional[int] = None
259
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
249
+ count: int, skip: int | None = None
250
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
260
251
  """Projects each element of an observable sequence into zero or more
261
252
  buffers which are produced based on element count information.
262
253
 
@@ -288,9 +279,9 @@ def buffer_with_count(
288
279
 
289
280
  def buffer_with_time(
290
281
  timespan: typing.RelativeTime,
291
- timeshift: Optional[typing.RelativeTime] = None,
292
- scheduler: Optional[abc.SchedulerBase] = None,
293
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
282
+ timeshift: typing.RelativeTime | None = None,
283
+ scheduler: abc.SchedulerBase | None = None,
284
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
294
285
  """Projects each element of an observable sequence into zero or more
295
286
  buffers which are produced based on timing information.
296
287
 
@@ -329,8 +320,8 @@ def buffer_with_time(
329
320
  def buffer_with_time_or_count(
330
321
  timespan: typing.RelativeTime,
331
322
  count: int,
332
- scheduler: Optional[abc.SchedulerBase] = None,
333
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
323
+ scheduler: abc.SchedulerBase | None = None,
324
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
334
325
  """Projects each element of an observable sequence into a buffer
335
326
  that is completed when either it's full or a given amount of time
336
327
  has elapsed.
@@ -364,9 +355,7 @@ def buffer_with_time_or_count(
364
355
 
365
356
 
366
357
  def catch(
367
- handler: Union[
368
- Observable[_T], Callable[[Exception, Observable[_T]], Observable[_T]]
369
- ],
358
+ handler: Observable[_T] | Callable[[Exception, Observable[_T]], Observable[_T]],
370
359
  ) -> Callable[[Observable[_T]], Observable[_T]]:
371
360
  """Continues an observable sequence that is terminated by an
372
361
  exception with the next observable sequence.
@@ -492,7 +481,7 @@ def concat_map(
492
481
 
493
482
 
494
483
  def contains(
495
- value: _T, comparer: Optional[typing.Comparer[_T]] = None
484
+ value: _T, comparer: typing.Comparer[_T] | None = None
496
485
  ) -> Callable[[Observable[_T]], Observable[bool]]:
497
486
  """Determines whether an observable sequence contains a specified
498
487
  element with an optional equality comparer.
@@ -524,7 +513,7 @@ def contains(
524
513
 
525
514
 
526
515
  def count(
527
- predicate: Optional[typing.Predicate[_T]] = None,
516
+ predicate: typing.Predicate[_T] | None = None,
528
517
  ) -> Callable[[Observable[_T]], Observable[int]]:
529
518
  """Returns an observable sequence containing a value that
530
519
  represents how many elements in the specified observable sequence
@@ -558,7 +547,7 @@ def count(
558
547
 
559
548
 
560
549
  def debounce(
561
- duetime: typing.RelativeTime, scheduler: Optional[abc.SchedulerBase] = None
550
+ duetime: typing.RelativeTime, scheduler: abc.SchedulerBase | None = None
562
551
  ) -> Callable[[Observable[_T]], Observable[_T]]:
563
552
  """Ignores values from an observable sequence which are followed by
564
553
  another value before duetime.
@@ -597,7 +586,7 @@ def default_if_empty(
597
586
 
598
587
 
599
588
  @overload
600
- def default_if_empty() -> Callable[[Observable[_T]], Observable[Optional[_T]]]: ...
589
+ def default_if_empty() -> Callable[[Observable[_T]], Observable[_T | None]]: ...
601
590
 
602
591
 
603
592
  def default_if_empty(
@@ -634,7 +623,7 @@ def default_if_empty(
634
623
 
635
624
  def delay_subscription(
636
625
  duetime: typing.AbsoluteOrRelativeTime,
637
- scheduler: Optional[abc.SchedulerBase] = None,
626
+ scheduler: abc.SchedulerBase | None = None,
638
627
  ) -> Callable[[Observable[_T]], Observable[_T]]:
639
628
  """Time shifts the observable sequence by delaying the
640
629
  subscription.
@@ -664,12 +653,10 @@ def delay_subscription(
664
653
 
665
654
 
666
655
  def delay_with_mapper(
667
- subscription_delay: Union[
668
- Observable[Any],
669
- typing.Mapper[Any, Observable[Any]],
670
- None,
671
- ] = None,
672
- delay_duration_mapper: Optional[typing.Mapper[_T, Observable[Any]]] = None,
656
+ subscription_delay: Observable[Any]
657
+ | typing.Mapper[Any, Observable[Any]]
658
+ | None = None,
659
+ delay_duration_mapper: typing.Mapper[_T, Observable[Any]] | None = None,
673
660
  ) -> Callable[[Observable[_T]], Observable[_T]]:
674
661
  """Time shifts the observable sequence based on a subscription
675
662
  delay and a delay mapper function for each element.
@@ -720,7 +707,7 @@ def dematerialize() -> Callable[[Observable[Notification[_T]]], Observable[_T]]:
720
707
 
721
708
 
722
709
  def delay(
723
- duetime: typing.RelativeTime, scheduler: Optional[abc.SchedulerBase] = None
710
+ duetime: typing.RelativeTime, scheduler: abc.SchedulerBase | None = None
724
711
  ) -> Callable[[Observable[_T]], Observable[_T]]:
725
712
  """The delay operator.
726
713
 
@@ -754,8 +741,8 @@ def delay(
754
741
 
755
742
 
756
743
  def distinct(
757
- key_mapper: Optional[Mapper[_T, _TKey]] = None,
758
- comparer: Optional[Comparer[_TKey]] = None,
744
+ key_mapper: Mapper[_T, _TKey] | None = None,
745
+ comparer: Comparer[_TKey] | None = None,
759
746
  ) -> Callable[[Observable[_T]], Observable[_T]]:
760
747
  """Returns an observable sequence that contains only distinct
761
748
  elements according to the key_mapper and the comparer. Usage of
@@ -792,8 +779,8 @@ def distinct(
792
779
 
793
780
 
794
781
  def distinct_until_changed(
795
- key_mapper: Optional[Mapper[_T, _TKey]] = None,
796
- comparer: Optional[Comparer[_TKey]] = None,
782
+ key_mapper: Mapper[_T, _TKey] | None = None,
783
+ comparer: Comparer[_TKey] | None = None,
797
784
  ) -> Callable[[Observable[_T]], Observable[_T]]:
798
785
  """Returns an observable sequence that contains only distinct
799
786
  contiguous elements according to the key_mapper and the comparer.
@@ -859,9 +846,9 @@ def do(observer: abc.ObserverBase[_T]) -> Callable[[Observable[_T]], Observable[
859
846
 
860
847
 
861
848
  def do_action(
862
- on_next: Optional[typing.OnNext[_T]] = None,
863
- on_error: Optional[typing.OnError] = None,
864
- on_completed: Optional[typing.OnCompleted] = None,
849
+ on_next: typing.OnNext[_T] | None = None,
850
+ on_error: typing.OnError | None = None,
851
+ on_completed: typing.OnCompleted | None = None,
865
852
  ) -> Callable[[Observable[_T]], Observable[_T]]:
866
853
  """Invokes an action for each element in the observable sequence
867
854
  and invokes an action on graceful or exceptional termination of the
@@ -953,7 +940,7 @@ def element_at(index: int) -> Callable[[Observable[_T]], Observable[_T]]:
953
940
 
954
941
 
955
942
  def element_at_or_default(
956
- index: int, default_value: Optional[_T] = None
943
+ index: int, default_value: _T | None = None
957
944
  ) -> Callable[[Observable[_T]], Observable[_T]]:
958
945
  """Returns the element at a specified index in a sequence or a
959
946
  default value if the index is out of range.
@@ -1058,7 +1045,7 @@ def filter(predicate: Predicate[_T]) -> Callable[[Observable[_T]], Observable[_T
1058
1045
 
1059
1046
 
1060
1047
  def filter_indexed(
1061
- predicate_indexed: Optional[PredicateIndexed[_T]] = None,
1048
+ predicate_indexed: PredicateIndexed[_T] | None = None,
1062
1049
  ) -> Callable[[Observable[_T]], Observable[_T]]:
1063
1050
  """Filters the elements of an observable sequence based on a
1064
1051
  predicate by incorporating the element's index.
@@ -1119,7 +1106,7 @@ def finally_action(action: typing.Action) -> Callable[[Observable[_T]], Observab
1119
1106
 
1120
1107
  def find(
1121
1108
  predicate: Callable[[_T, int, Observable[_T]], bool],
1122
- ) -> Callable[[Observable[_T]], Observable[Union[_T, None]]]:
1109
+ ) -> Callable[[Observable[_T]], Observable[_T | None]]:
1123
1110
  """Searches for an element that matches the conditions defined by
1124
1111
  the specified predicate, and returns the first occurrence within
1125
1112
  the entire Observable sequence.
@@ -1144,14 +1131,14 @@ def find(
1144
1131
  from ._find import find_value_
1145
1132
 
1146
1133
  return cast(
1147
- Callable[[Observable[_T]], Observable[Union[_T, None]]],
1134
+ Callable[[Observable[_T]], Observable[_T | None]],
1148
1135
  find_value_(predicate, False),
1149
1136
  )
1150
1137
 
1151
1138
 
1152
1139
  def find_index(
1153
1140
  predicate: Callable[[_T, int, Observable[_T]], bool],
1154
- ) -> Callable[[Observable[_T]], Observable[Union[int, None]]]:
1141
+ ) -> Callable[[Observable[_T]], Observable[int | None]]:
1155
1142
  """Searches for an element that matches the conditions defined by
1156
1143
  the specified predicate, and returns an Observable sequence with the
1157
1144
  zero-based index of the first occurrence within the entire
@@ -1177,13 +1164,13 @@ def find_index(
1177
1164
  from ._find import find_value_
1178
1165
 
1179
1166
  return cast(
1180
- Callable[[Observable[_T]], Observable[Union[int, None]]],
1167
+ Callable[[Observable[_T]], Observable[int | None]],
1181
1168
  find_value_(predicate, True),
1182
1169
  )
1183
1170
 
1184
1171
 
1185
1172
  def first(
1186
- predicate: Optional[Predicate[_T]] = None,
1173
+ predicate: Predicate[_T] | None = None,
1187
1174
  ) -> Callable[[Observable[_T]], Observable[_T]]:
1188
1175
  """Returns the first element of an observable sequence that
1189
1176
  satisfies the condition in the predicate if present else the first
@@ -1217,7 +1204,7 @@ def first(
1217
1204
 
1218
1205
 
1219
1206
  def first_or_default(
1220
- predicate: Optional[Predicate[_T]] = None, default_value: Optional[_T] = None
1207
+ predicate: Predicate[_T] | None = None, default_value: _T | None = None
1221
1208
  ) -> Callable[[Observable[_T]], Observable[_T]]:
1222
1209
  """Returns the first element of an observable sequence that
1223
1210
  satisfies the condition in the predicate, or a default value if no
@@ -1255,30 +1242,30 @@ def first_or_default(
1255
1242
 
1256
1243
  @overload
1257
1244
  def flat_map(
1258
- mapper: Optional[Iterable[_T2]] = None,
1245
+ mapper: Iterable[_T2] | None = None,
1259
1246
  ) -> Callable[[Observable[Any]], Observable[_T2]]: ...
1260
1247
 
1261
1248
 
1262
1249
  @overload
1263
1250
  def flat_map(
1264
- mapper: Optional[Observable[_T2]] = None,
1251
+ mapper: Observable[_T2] | None = None,
1265
1252
  ) -> Callable[[Observable[Any]], Observable[_T2]]: ...
1266
1253
 
1267
1254
 
1268
1255
  @overload
1269
1256
  def flat_map(
1270
- mapper: Optional[Mapper[_T1, Iterable[_T2]]] = None,
1257
+ mapper: Mapper[_T1, Iterable[_T2]] | None = None,
1271
1258
  ) -> Callable[[Observable[_T1]], Observable[_T2]]: ...
1272
1259
 
1273
1260
 
1274
1261
  @overload
1275
1262
  def flat_map(
1276
- mapper: Optional[Mapper[_T1, Observable[_T2]]] = None,
1263
+ mapper: Mapper[_T1, Observable[_T2]] | None = None,
1277
1264
  ) -> Callable[[Observable[_T1]], Observable[_T2]]: ...
1278
1265
 
1279
1266
 
1280
1267
  def flat_map(
1281
- mapper: Optional[Any] = None,
1268
+ mapper: Any | None = None,
1282
1269
  ) -> Callable[[Observable[Any]], Observable[Any]]:
1283
1270
  """The flat_map operator.
1284
1271
 
@@ -1324,25 +1311,25 @@ def flat_map(
1324
1311
 
1325
1312
  @overload
1326
1313
  def flat_map_indexed(
1327
- mapper_indexed: Optional[Iterable[_T2]] = None,
1314
+ mapper_indexed: Iterable[_T2] | None = None,
1328
1315
  ) -> Callable[[Observable[Any]], Observable[_T2]]: ...
1329
1316
 
1330
1317
 
1331
1318
  @overload
1332
1319
  def flat_map_indexed(
1333
- mapper_indexed: Optional[Observable[_T2]] = None,
1320
+ mapper_indexed: Observable[_T2] | None = None,
1334
1321
  ) -> Callable[[Observable[Any]], Observable[_T2]]: ...
1335
1322
 
1336
1323
 
1337
1324
  @overload
1338
1325
  def flat_map_indexed(
1339
- mapper_indexed: Optional[MapperIndexed[_T1, Iterable[_T2]]] = None,
1326
+ mapper_indexed: MapperIndexed[_T1, Iterable[_T2]] | None = None,
1340
1327
  ) -> Callable[[Observable[_T1]], Observable[_T2]]: ...
1341
1328
 
1342
1329
 
1343
1330
  @overload
1344
1331
  def flat_map_indexed(
1345
- mapper_indexed: Optional[MapperIndexed[_T1, Observable[_T2]]] = None,
1332
+ mapper_indexed: MapperIndexed[_T1, Observable[_T2]] | None = None,
1346
1333
  ) -> Callable[[Observable[_T1]], Observable[_T2]]: ...
1347
1334
 
1348
1335
 
@@ -1419,7 +1406,7 @@ def flat_map_latest(
1419
1406
 
1420
1407
  def fork_join(
1421
1408
  *others: Observable[Any],
1422
- ) -> Callable[[Observable[Any]], Observable[Tuple[Any, ...]]]:
1409
+ ) -> Callable[[Observable[Any]], Observable[tuple[Any, ...]]]:
1423
1410
  """Wait for observables to complete and then combine last values
1424
1411
  they emitted into a tuple. Whenever any of that observables completes
1425
1412
  without emitting any value, result sequence will complete at that moment as well.
@@ -1449,8 +1436,8 @@ def fork_join(
1449
1436
 
1450
1437
  def group_by(
1451
1438
  key_mapper: Mapper[_T, _TKey],
1452
- element_mapper: Optional[Mapper[_T, _TValue]] = None,
1453
- subject_mapper: Optional[Callable[[], Subject[_TValue]]] = None,
1439
+ element_mapper: Mapper[_T, _TValue] | None = None,
1440
+ subject_mapper: Callable[[], Subject[_TValue]] | None = None,
1454
1441
  ) -> Callable[[Observable[_T]], Observable[GroupedObservable[_TKey, _TValue]]]:
1455
1442
  """Groups the elements of an observable sequence according to a
1456
1443
  specified key mapper function and comparer and selects the
@@ -1490,9 +1477,9 @@ def group_by(
1490
1477
 
1491
1478
  def group_by_until(
1492
1479
  key_mapper: Mapper[_T, _TKey],
1493
- element_mapper: Optional[Mapper[_T, _TValue]],
1480
+ element_mapper: Mapper[_T, _TValue] | None,
1494
1481
  duration_mapper: Callable[[GroupedObservable[_TKey, _TValue]], Observable[Any]],
1495
- subject_mapper: Optional[Callable[[], Subject[_TValue]]] = None,
1482
+ subject_mapper: Callable[[], Subject[_TValue]] | None = None,
1496
1483
  ) -> Callable[[Observable[_T]], Observable[GroupedObservable[_TKey, _TValue]]]:
1497
1484
  """Groups the elements of an observable sequence according to a
1498
1485
  specified key mapper function. A duration mapper function is used
@@ -1547,7 +1534,7 @@ def group_join(
1547
1534
  right: Observable[_TRight],
1548
1535
  left_duration_mapper: Callable[[_TLeft], Observable[Any]],
1549
1536
  right_duration_mapper: Callable[[_TRight], Observable[Any]],
1550
- ) -> Callable[[Observable[_TLeft]], Observable[Tuple[_TLeft, Observable[_TRight]]]]:
1537
+ ) -> Callable[[Observable[_TLeft]], Observable[tuple[_TLeft, Observable[_TRight]]]]:
1551
1538
  """Correlates the elements of two sequences based on overlapping
1552
1539
  durations, and groups the results.
1553
1540
 
@@ -1626,7 +1613,7 @@ def join(
1626
1613
  right: Observable[_T2],
1627
1614
  left_duration_mapper: Callable[[Any], Observable[Any]],
1628
1615
  right_duration_mapper: Callable[[Any], Observable[Any]],
1629
- ) -> Callable[[Observable[_T1]], Observable[Tuple[_T1, _T2]]]:
1616
+ ) -> Callable[[Observable[_T1]], Observable[tuple[_T1, _T2]]]:
1630
1617
  """Correlates the elements of two sequences based on overlapping
1631
1618
  durations.
1632
1619
 
@@ -1659,7 +1646,7 @@ def join(
1659
1646
 
1660
1647
 
1661
1648
  def last(
1662
- predicate: Optional[Predicate[_T]] = None,
1649
+ predicate: Predicate[_T] | None = None,
1663
1650
  ) -> Callable[[Observable[_T]], Observable[_T]]:
1664
1651
  """The last operator.
1665
1652
 
@@ -1693,7 +1680,7 @@ def last(
1693
1680
 
1694
1681
 
1695
1682
  @overload
1696
- def last_or_default() -> Callable[[Observable[_T]], Observable[Optional[_T]]]: ...
1683
+ def last_or_default() -> Callable[[Observable[_T]], Observable[_T | None]]: ...
1697
1684
 
1698
1685
 
1699
1686
  @overload
@@ -1711,7 +1698,7 @@ def last_or_default(
1711
1698
 
1712
1699
  def last_or_default(
1713
1700
  default_value: Any = None,
1714
- predicate: Optional[Predicate[_T]] = None,
1701
+ predicate: Predicate[_T] | None = None,
1715
1702
  ) -> Callable[[Observable[_T]], Observable[Any]]:
1716
1703
  """The last_or_default operator.
1717
1704
 
@@ -1751,7 +1738,7 @@ def last_or_default(
1751
1738
 
1752
1739
 
1753
1740
  def map(
1754
- mapper: Optional[Mapper[_T1, _T2]] = None,
1741
+ mapper: Mapper[_T1, _T2] | None = None,
1755
1742
  ) -> Callable[[Observable[_T1]], Observable[_T2]]:
1756
1743
  """The map operator.
1757
1744
 
@@ -1783,7 +1770,7 @@ def map(
1783
1770
 
1784
1771
 
1785
1772
  def map_indexed(
1786
- mapper_indexed: Optional[MapperIndexed[_T1, _T2]] = None,
1773
+ mapper_indexed: MapperIndexed[_T1, _T2] | None = None,
1787
1774
  ) -> Callable[[Observable[_T1]], Observable[_T2]]:
1788
1775
  """Project each element of an observable sequence into a new form
1789
1776
  by incorporating the element's index.
@@ -1823,13 +1810,13 @@ def materialize() -> Callable[[Observable[_T]], Observable[Notification[_T]]]:
1823
1810
  returns an observable sequence containing the materialized
1824
1811
  notification values from the source sequence.
1825
1812
  """
1826
- from ._materialize import materialize
1813
+ from ._materialize import materialize_
1827
1814
 
1828
- return materialize()
1815
+ return materialize_()
1829
1816
 
1830
1817
 
1831
1818
  def max(
1832
- comparer: Optional[Comparer[_T]] = None,
1819
+ comparer: Comparer[_T] | None = None,
1833
1820
  ) -> Callable[[Observable[_T]], Observable[_T]]:
1834
1821
  """Returns the maximum value in an observable sequence according to
1835
1822
  the specified comparer.
@@ -1859,8 +1846,8 @@ def max(
1859
1846
 
1860
1847
 
1861
1848
  def max_by(
1862
- key_mapper: Mapper[_T, _TKey], comparer: Optional[Comparer[_TKey]] = None
1863
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
1849
+ key_mapper: Mapper[_T, _TKey], comparer: Comparer[_TKey] | None = None
1850
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
1864
1851
  """The max_by operator.
1865
1852
 
1866
1853
  Returns the elements in an observable sequence with the maximum
@@ -1892,7 +1879,7 @@ def max_by(
1892
1879
 
1893
1880
 
1894
1881
  def merge(
1895
- *sources: Observable[Any], max_concurrent: Optional[int] = None
1882
+ *sources: Observable[Any], max_concurrent: int | None = None
1896
1883
  ) -> Callable[[Observable[Any]], Observable[Any]]:
1897
1884
  """Merges an observable sequence of observable sequences into an
1898
1885
  observable sequence, limiting the number of concurrent
@@ -1951,7 +1938,7 @@ def merge_all() -> Callable[[Observable[Observable[_T]]], Observable[_T]]:
1951
1938
 
1952
1939
 
1953
1940
  def min(
1954
- comparer: Optional[Comparer[_T]] = None,
1941
+ comparer: Comparer[_T] | None = None,
1955
1942
  ) -> Callable[[Observable[_T]], Observable[_T]]:
1956
1943
  """The `min` operator.
1957
1944
 
@@ -1983,8 +1970,8 @@ def min(
1983
1970
 
1984
1971
 
1985
1972
  def min_by(
1986
- key_mapper: Mapper[_T, _TKey], comparer: Optional[Comparer[_TKey]] = None
1987
- ) -> Callable[[Observable[_T]], Observable[List[_T]]]:
1973
+ key_mapper: Mapper[_T, _TKey], comparer: Comparer[_TKey] | None = None
1974
+ ) -> Callable[[Observable[_T]], Observable[list[_T]]]:
1988
1975
  """The `min_by` operator.
1989
1976
 
1990
1977
  Returns the elements in an observable sequence with the minimum key
@@ -2028,19 +2015,18 @@ def multicast(
2028
2015
  @overload
2029
2016
  def multicast(
2030
2017
  *,
2031
- subject_factory: Callable[[Optional[abc.SchedulerBase]], abc.SubjectBase[_T]],
2032
- mapper: Optional[Callable[[Observable[_T]], Observable[_T2]]] = None,
2018
+ subject_factory: Callable[[abc.SchedulerBase | None], abc.SubjectBase[_T]],
2019
+ mapper: Callable[[Observable[_T]], Observable[_T2]] | None = None,
2033
2020
  ) -> Callable[[Observable[_T]], Observable[_T2]]: ...
2034
2021
 
2035
2022
 
2036
2023
  def multicast(
2037
- subject: Optional[abc.SubjectBase[_T]] = None,
2024
+ subject: abc.SubjectBase[_T] | None = None,
2038
2025
  *,
2039
- subject_factory: Optional[
2040
- Callable[[Optional[abc.SchedulerBase]], abc.SubjectBase[_T]]
2041
- ] = None,
2042
- mapper: Optional[Callable[[Observable[_T]], Observable[_T2]]] = None,
2043
- ) -> Callable[[Observable[_T]], Union[Observable[_T2], ConnectableObservable[_T]]]:
2026
+ subject_factory: Callable[[abc.SchedulerBase | None], abc.SubjectBase[_T]]
2027
+ | None = None,
2028
+ mapper: Callable[[Observable[_T]], Observable[_T2]] | None = None,
2029
+ ) -> Callable[[Observable[_T]], Observable[_T2] | ConnectableObservable[_T]]:
2044
2030
  """Multicasts the source sequence notifications through an
2045
2031
  instantiated subject into all uses of the sequence within a mapper
2046
2032
  function. Each subscription to the resulting sequence causes a
@@ -2128,7 +2114,7 @@ def on_error_resume_next(
2128
2114
  return on_error_resume_next_(second)
2129
2115
 
2130
2116
 
2131
- def pairwise() -> Callable[[Observable[_T]], Observable[Tuple[_T, _T]]]:
2117
+ def pairwise() -> Callable[[Observable[_T]], Observable[tuple[_T, _T]]]:
2132
2118
  """The pairwise operator.
2133
2119
 
2134
2120
  Returns a new observable that triggers on the second and subsequent
@@ -2149,7 +2135,7 @@ def pairwise() -> Callable[[Observable[_T]], Observable[Tuple[_T, _T]]]:
2149
2135
 
2150
2136
  def partition(
2151
2137
  predicate: Predicate[_T],
2152
- ) -> Callable[[Observable[_T]], List[Observable[_T]]]:
2138
+ ) -> Callable[[Observable[_T]], list[Observable[_T]]]:
2153
2139
  """Returns two observables which partition the observations of the
2154
2140
  source by the given function. The first will trigger observations
2155
2141
  for those values for which the predicate returns true. The second
@@ -2183,7 +2169,7 @@ def partition(
2183
2169
 
2184
2170
  def partition_indexed(
2185
2171
  predicate_indexed: PredicateIndexed[_T],
2186
- ) -> Callable[[Observable[_T]], List[Observable[_T]]]:
2172
+ ) -> Callable[[Observable[_T]], list[Observable[_T]]]:
2187
2173
  """The indexed partition operator.
2188
2174
 
2189
2175
  Returns two observables which partition the observations of the
@@ -2218,7 +2204,7 @@ def partition_indexed(
2218
2204
 
2219
2205
  def pluck(
2220
2206
  key: _TKey,
2221
- ) -> Callable[[Observable[Dict[_TKey, _TValue]]], Observable[_TValue]]:
2207
+ ) -> Callable[[Observable[dict[_TKey, _TValue]]], Observable[_TValue]]:
2222
2208
  """Retrieves the value of a specified key using dict-like access (as in
2223
2209
  element[key]) from all elements in the Observable sequence.
2224
2210
 
@@ -2266,8 +2252,8 @@ def publish(
2266
2252
 
2267
2253
 
2268
2254
  def publish(
2269
- mapper: Optional[Mapper[Observable[_T1], Observable[_T2]]] = None,
2270
- ) -> Callable[[Observable[_T1]], Union[Observable[_T2], ConnectableObservable[_T1]]]:
2255
+ mapper: Mapper[Observable[_T1], Observable[_T2]] | None = None,
2256
+ ) -> Callable[[Observable[_T1]], Observable[_T2] | ConnectableObservable[_T1]]:
2271
2257
  """The `publish` operator.
2272
2258
 
2273
2259
  Returns an observable sequence that is the result of invoking the
@@ -2313,11 +2299,11 @@ def publish_value(
2313
2299
 
2314
2300
  def publish_value(
2315
2301
  initial_value: _T1,
2316
- mapper: Optional[Mapper[Observable[_T1], Observable[_T2]]] = None,
2317
- ) -> Union[
2318
- Callable[[Observable[_T1]], ConnectableObservable[_T1]],
2319
- Callable[[Observable[_T1]], Observable[_T2]],
2320
- ]:
2302
+ mapper: Mapper[Observable[_T1], Observable[_T2]] | None = None,
2303
+ ) -> (
2304
+ Callable[[Observable[_T1]], ConnectableObservable[_T1]]
2305
+ | Callable[[Observable[_T1]], Observable[_T2]]
2306
+ ):
2321
2307
  """Returns an observable sequence that is the result of invoking
2322
2308
  the mapper on a connectable observable sequence that shares a
2323
2309
  single subscription to the underlying sequence and starts with
@@ -2365,7 +2351,7 @@ def reduce(
2365
2351
 
2366
2352
 
2367
2353
  def reduce(
2368
- accumulator: Accumulator[_TState, _T], seed: Union[_TState, Type[NotSet]] = NotSet
2354
+ accumulator: Accumulator[_TState, _T], seed: _TState | type[NotSet] = NotSet
2369
2355
  ) -> Callable[[Observable[_T]], Observable[Any]]:
2370
2356
  """The reduce operator.
2371
2357
 
@@ -2414,7 +2400,7 @@ def ref_count() -> Callable[[ConnectableObservable[_T]], Observable[_T]]:
2414
2400
 
2415
2401
 
2416
2402
  def repeat(
2417
- repeat_count: Optional[int] = None,
2403
+ repeat_count: int | None = None,
2418
2404
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2419
2405
  """Repeats the observable sequence a specified number of times.
2420
2406
  If the repeat count is not specified, the sequence repeats
@@ -2447,30 +2433,30 @@ def repeat(
2447
2433
 
2448
2434
  @overload
2449
2435
  def replay(
2450
- buffer_size: Optional[int] = None,
2451
- window: Optional[typing.RelativeTime] = None,
2436
+ buffer_size: int | None = None,
2437
+ window: typing.RelativeTime | None = None,
2452
2438
  *,
2453
- scheduler: Optional[abc.SchedulerBase] = None,
2439
+ scheduler: abc.SchedulerBase | None = None,
2454
2440
  ) -> Callable[[Observable[_T1]], ConnectableObservable[_T1]]: ...
2455
2441
 
2456
2442
 
2457
2443
  @overload
2458
2444
  def replay(
2459
- buffer_size: Optional[int] = None,
2460
- window: Optional[typing.RelativeTime] = None,
2445
+ buffer_size: int | None = None,
2446
+ window: typing.RelativeTime | None = None,
2461
2447
  *,
2462
- mapper: Optional[Mapper[Observable[_T1], Observable[_T2]]],
2463
- scheduler: Optional[abc.SchedulerBase] = None,
2448
+ mapper: Mapper[Observable[_T1], Observable[_T2]] | None,
2449
+ scheduler: abc.SchedulerBase | None = None,
2464
2450
  ) -> Callable[[Observable[_T1]], Observable[_T2]]: ...
2465
2451
 
2466
2452
 
2467
2453
  def replay(
2468
- buffer_size: Optional[int] = None,
2469
- window: Optional[typing.RelativeTime] = None,
2454
+ buffer_size: int | None = None,
2455
+ window: typing.RelativeTime | None = None,
2470
2456
  *,
2471
- mapper: Optional[Mapper[Observable[_T1], Observable[_T2]]] = None,
2472
- scheduler: Optional[abc.SchedulerBase] = None,
2473
- ) -> Callable[[Observable[_T1]], Union[Observable[_T2], ConnectableObservable[_T1]]]:
2457
+ mapper: Mapper[Observable[_T1], Observable[_T2]] | None = None,
2458
+ scheduler: abc.SchedulerBase | None = None,
2459
+ ) -> Callable[[Observable[_T1]], Observable[_T2] | ConnectableObservable[_T1]]:
2474
2460
  """The `replay` operator.
2475
2461
 
2476
2462
  Returns an observable sequence that is the result of invoking the
@@ -2511,7 +2497,7 @@ def replay(
2511
2497
 
2512
2498
 
2513
2499
  def retry(
2514
- retry_count: Optional[int] = None,
2500
+ retry_count: int | None = None,
2515
2501
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2516
2502
  """Repeats the source observable sequence the specified number of
2517
2503
  times or until it successfully terminates. If the retry count is
@@ -2535,8 +2521,8 @@ def retry(
2535
2521
 
2536
2522
 
2537
2523
  def sample(
2538
- sampler: Union[typing.RelativeTime, Observable[Any]],
2539
- scheduler: Optional[abc.SchedulerBase] = None,
2524
+ sampler: typing.RelativeTime | Observable[Any],
2525
+ scheduler: abc.SchedulerBase | None = None,
2540
2526
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2541
2527
  """Samples the observable sequence at each interval.
2542
2528
 
@@ -2574,12 +2560,12 @@ def scan(
2574
2560
 
2575
2561
  @overload
2576
2562
  def scan(
2577
- accumulator: Accumulator[_TState, _T], seed: Union[_TState, Type[NotSet]]
2563
+ accumulator: Accumulator[_TState, _T], seed: _TState | type[NotSet]
2578
2564
  ) -> Callable[[Observable[_T]], Observable[_TState]]: ...
2579
2565
 
2580
2566
 
2581
2567
  def scan(
2582
- accumulator: Accumulator[_TState, _T], seed: Union[_TState, Type[NotSet]] = NotSet
2568
+ accumulator: Accumulator[_TState, _T], seed: _TState | type[NotSet] = NotSet
2583
2569
  ) -> Callable[[Observable[_T]], Observable[_TState]]:
2584
2570
  """The scan operator.
2585
2571
 
@@ -2615,7 +2601,7 @@ def scan(
2615
2601
 
2616
2602
 
2617
2603
  def sequence_equal(
2618
- second: Union[Observable[_T], Iterable[_T]], comparer: Optional[Comparer[_T]] = None
2604
+ second: Observable[_T] | Iterable[_T], comparer: Comparer[_T] | None = None
2619
2605
  ) -> Callable[[Observable[_T]], Observable[bool]]:
2620
2606
  """Determines whether two sequences are equal by comparing the
2621
2607
  elements pairwise using a specified equality comparer.
@@ -2672,7 +2658,7 @@ def share() -> Callable[[Observable[_T]], Observable[_T]]:
2672
2658
 
2673
2659
 
2674
2660
  def single(
2675
- predicate: Optional[Predicate[_T]] = None,
2661
+ predicate: Predicate[_T] | None = None,
2676
2662
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2677
2663
  """The single operator.
2678
2664
 
@@ -2707,7 +2693,7 @@ def single(
2707
2693
 
2708
2694
 
2709
2695
  def single_or_default(
2710
- predicate: Optional[Predicate[_T]] = None, default_value: Any = None
2696
+ predicate: Predicate[_T] | None = None, default_value: Any = None
2711
2697
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2712
2698
  """Returns the only element of an observable sequence that matches
2713
2699
  the predicate, or a default value if no such element exists this
@@ -2814,7 +2800,7 @@ def skip_last(count: int) -> Callable[[Observable[_T]], Observable[_T]]:
2814
2800
 
2815
2801
 
2816
2802
  def skip_last_with_time(
2817
- duration: typing.RelativeTime, scheduler: Optional[abc.SchedulerBase] = None
2803
+ duration: typing.RelativeTime, scheduler: abc.SchedulerBase | None = None
2818
2804
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2819
2805
  """Skips elements for the specified duration from the end of the
2820
2806
  observable source sequence.
@@ -2873,7 +2859,7 @@ def skip_until(
2873
2859
 
2874
2860
  def skip_until_with_time(
2875
2861
  start_time: typing.AbsoluteOrRelativeTime,
2876
- scheduler: Optional[abc.SchedulerBase] = None,
2862
+ scheduler: abc.SchedulerBase | None = None,
2877
2863
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2878
2864
  """Skips elements from the observable source sequence until the
2879
2865
  specified start time.
@@ -2976,7 +2962,7 @@ def skip_while_indexed(
2976
2962
 
2977
2963
 
2978
2964
  def skip_with_time(
2979
- duration: typing.RelativeTime, scheduler: Optional[abc.SchedulerBase] = None
2965
+ duration: typing.RelativeTime, scheduler: abc.SchedulerBase | None = None
2980
2966
  ) -> Callable[[Observable[_T]], Observable[_T]]:
2981
2967
  """Skips elements for the specified duration from the start of the
2982
2968
  observable source sequence.
@@ -3015,7 +3001,7 @@ def skip_with_time(
3015
3001
 
3016
3002
 
3017
3003
  def slice(
3018
- start: Optional[int] = None, stop: Optional[int] = None, step: Optional[int] = None
3004
+ start: int | None = None, stop: int | None = None, step: int | None = None
3019
3005
  ) -> Callable[[Observable[_T]], Observable[_T]]:
3020
3006
  """The slice operator.
3021
3007
 
@@ -3053,7 +3039,7 @@ def slice(
3053
3039
 
3054
3040
 
3055
3041
  def some(
3056
- predicate: Optional[Predicate[_T]] = None,
3042
+ predicate: Predicate[_T] | None = None,
3057
3043
  ) -> Callable[[Observable[_T]], Observable[bool]]:
3058
3044
  """The some operator.
3059
3045
 
@@ -3088,25 +3074,17 @@ def some(
3088
3074
 
3089
3075
 
3090
3076
  @overload
3091
- def starmap(
3092
- mapper: Callable[[_A, _B], _T],
3093
- ) -> Callable[[Observable[Tuple[_A, _B]]], Observable[_T]]: ...
3077
+ def starmap() -> Callable[[Observable[_T]], Observable[_T]]: ...
3094
3078
 
3095
3079
 
3096
3080
  @overload
3097
3081
  def starmap(
3098
- mapper: Callable[[_A, _B, _C], _T],
3099
- ) -> Callable[[Observable[Tuple[_A, _B, _C]]], Observable[_T]]: ...
3082
+ mapper: Callable[[Unpack[_Ts]], _T],
3083
+ ) -> Callable[[Observable[tuple[Unpack[_Ts]]]], Observable[_T]]: ...
3100
3084
 
3101
3085
 
3102
- @overload
3103
3086
  def starmap(
3104
- mapper: Callable[[_A, _B, _C, _D], _T],
3105
- ) -> Callable[[Observable[Tuple[_A, _B, _C, _D]]], Observable[_T]]: ...
3106
-
3107
-
3108
- def starmap(
3109
- mapper: Optional[Callable[..., Any]] = None,
3087
+ mapper: Callable[[Unpack[_Ts]], _T] | None = None,
3110
3088
  ) -> Callable[[Observable[Any]], Observable[Any]]:
3111
3089
  """The starmap operator.
3112
3090
 
@@ -3130,7 +3108,7 @@ def starmap(
3130
3108
 
3131
3109
  Args:
3132
3110
  mapper: A transform function to invoke with unpacked elements
3133
- as arguments.
3111
+ as arguments. If not provided, returns the tuple unchanged.
3134
3112
 
3135
3113
  Returns:
3136
3114
  An operator function that takes an observable source and
@@ -3138,46 +3116,27 @@ def starmap(
3138
3116
  invoking the mapper function with unpacked elements of the
3139
3117
  source.
3140
3118
  """
3141
-
3142
3119
  if mapper is None:
3143
- return compose(identity)
3144
3120
 
3145
- def starred(values: Tuple[Any, ...]) -> Any:
3146
- assert mapper # mypy is paranoid
3147
- return mapper(*values)
3148
-
3149
- return compose(map(starred))
3150
-
3151
-
3152
- @overload
3153
- def starmap_indexed(
3154
- mapper: Callable[[_A, int], _T],
3155
- ) -> Callable[[Observable[_A]], Observable[_T]]: ...
3121
+ def identity_fn(x: Any) -> Any:
3122
+ return x
3156
3123
 
3124
+ return compose(map(identity_fn))
3157
3125
 
3158
- @overload
3159
- def starmap_indexed(
3160
- mapper: Callable[[_A, _B, int], _T],
3161
- ) -> Callable[[Observable[Tuple[_A, _B]]], Observable[_T]]: ...
3162
-
3163
-
3164
- @overload
3165
- def starmap_indexed(
3166
- mapper: Callable[[_A, _B, _C, int], _T],
3167
- ) -> Callable[[Observable[Tuple[_A, _B, _C]]], Observable[_T]]: ...
3168
-
3126
+ def starred(values: tuple[Unpack[_Ts]]) -> _T:
3127
+ return mapper(*values)
3169
3128
 
3170
- @overload
3171
- def starmap_indexed(
3172
- mapper: Callable[[_A, _B, _C, _D, int], _T],
3173
- ) -> Callable[[Observable[Tuple[_A, _B, _C, _D]]], Observable[_T]]: ...
3129
+ return compose(map(starred))
3174
3130
 
3175
3131
 
3176
3132
  def starmap_indexed(
3177
- mapper: Optional[Callable[..., Any]] = None,
3178
- ) -> Callable[[Observable[Any]], Observable[Any]]:
3133
+ mapper: Callable[[Unpack[_Ts], int], _T],
3134
+ ) -> Callable[[Observable[tuple[Unpack[_Ts], int]]], Observable[_T]]:
3179
3135
  """Variant of :func:`starmap` which accepts an indexed mapper.
3180
3136
 
3137
+ Note: This operator expects the input to already be indexed as flat tuples
3138
+ of (*values, index), which is what map_indexed provides via zip_with_iterable.
3139
+
3181
3140
  .. marble::
3182
3141
  :alt: starmap_indexed
3183
3142
 
@@ -3190,7 +3149,7 @@ def starmap_indexed(
3190
3149
 
3191
3150
  Args:
3192
3151
  mapper: A transform function to invoke with unpacked elements
3193
- as arguments.
3152
+ as arguments, plus the index.
3194
3153
 
3195
3154
  Returns:
3196
3155
  An operator function that takes an observable source and
@@ -3198,16 +3157,11 @@ def starmap_indexed(
3198
3157
  invoking the indexed mapper function with unpacked elements
3199
3158
  of the source.
3200
3159
  """
3201
- from ._map import map_
3202
3160
 
3203
- if mapper is None:
3204
- return compose(identity)
3205
-
3206
- def starred(values: Tuple[Any, ...]) -> Any:
3207
- assert mapper # mypy is paranoid
3208
- return mapper(*values)
3161
+ def starred(indexed_values: tuple[Unpack[_Ts], int]) -> _T:
3162
+ return mapper(*indexed_values)
3209
3163
 
3210
- return compose(map_(starred))
3164
+ return compose(map(starred))
3211
3165
 
3212
3166
 
3213
3167
  def start_with(*args: _T) -> Callable[[Observable[_T]], Observable[_T]]:
@@ -3271,7 +3225,7 @@ def sum(
3271
3225
 
3272
3226
 
3273
3227
  def sum(
3274
- key_mapper: Optional[Mapper[Any, float]] = None,
3228
+ key_mapper: Mapper[Any, float] | None = None,
3275
3229
  ) -> Callable[[Observable[Any]], Observable[float]]:
3276
3230
  """Computes the sum of a sequence of values that are obtained by
3277
3231
  invoking an optional transform function on each element of the
@@ -3333,7 +3287,7 @@ def switch_latest() -> (
3333
3287
 
3334
3288
 
3335
3289
  def switch_map(
3336
- project: Optional[Mapper[_T1, Observable[_T2]]] = None,
3290
+ project: Mapper[_T1, Observable[_T2]] | None = None,
3337
3291
  ) -> Callable[[Observable[_T1]], Observable[_T2]]:
3338
3292
  """Projects each source value to an Observable which is merged in
3339
3293
  the output Observable, emitting values only from the most recently
@@ -3373,7 +3327,7 @@ def switch_map(
3373
3327
 
3374
3328
 
3375
3329
  def switch_map_indexed(
3376
- project: Optional[MapperIndexed[_T1, Observable[_T2]]] = None,
3330
+ project: MapperIndexed[_T1, Observable[_T2]] | None = None,
3377
3331
  ) -> Callable[[Observable[_T1]], Observable[_T2]]:
3378
3332
  """Projects each source value to an Observable which is merged in
3379
3333
  the output Observable, emitting values only from the most recently
@@ -3471,7 +3425,7 @@ def take_last(count: int) -> Callable[[Observable[_T]], Observable[_T]]:
3471
3425
  return take_last_(count)
3472
3426
 
3473
3427
 
3474
- def take_last_buffer(count: int) -> Callable[[Observable[_T]], Observable[List[_T]]]:
3428
+ def take_last_buffer(count: int) -> Callable[[Observable[_T]], Observable[list[_T]]]:
3475
3429
  """The `take_last_buffer` operator.
3476
3430
 
3477
3431
  Returns an array with the specified number of contiguous elements
@@ -3508,7 +3462,7 @@ def take_last_buffer(count: int) -> Callable[[Observable[_T]], Observable[List[_
3508
3462
 
3509
3463
 
3510
3464
  def take_last_with_time(
3511
- duration: typing.RelativeTime, scheduler: Optional[abc.SchedulerBase] = None
3465
+ duration: typing.RelativeTime, scheduler: abc.SchedulerBase | None = None
3512
3466
  ) -> Callable[[Observable[_T]], Observable[_T]]:
3513
3467
  """Returns elements within the specified duration from the end of
3514
3468
  the observable source sequence.
@@ -3573,7 +3527,7 @@ def take_until(other: Observable[Any]) -> Callable[[Observable[_T]], Observable[
3573
3527
 
3574
3528
  def take_until_with_time(
3575
3529
  end_time: typing.AbsoluteOrRelativeTime,
3576
- scheduler: Optional[abc.SchedulerBase] = None,
3530
+ scheduler: abc.SchedulerBase | None = None,
3577
3531
  ) -> Callable[[Observable[_T]], Observable[_T]]:
3578
3532
  """Takes elements for the specified duration until the specified
3579
3533
  end time, using the specified scheduler to run timers.
@@ -3675,7 +3629,7 @@ def take_while_indexed(
3675
3629
 
3676
3630
 
3677
3631
  def take_with_time(
3678
- duration: typing.RelativeTime, scheduler: Optional[abc.SchedulerBase] = None
3632
+ duration: typing.RelativeTime, scheduler: abc.SchedulerBase | None = None
3679
3633
  ) -> Callable[[Observable[_T]], Observable[_T]]:
3680
3634
  """Takes elements for the specified duration from the start of the
3681
3635
  observable source sequence.
@@ -3711,7 +3665,7 @@ def take_with_time(
3711
3665
 
3712
3666
 
3713
3667
  def throttle_first(
3714
- window_duration: typing.RelativeTime, scheduler: Optional[abc.SchedulerBase] = None
3668
+ window_duration: typing.RelativeTime, scheduler: abc.SchedulerBase | None = None
3715
3669
  ) -> Callable[[Observable[_T]], Observable[_T]]:
3716
3670
  """Returns an Observable that emits only the first item emitted by
3717
3671
  the source Observable during sequential time windows of a specified
@@ -3760,7 +3714,7 @@ if TYPE_CHECKING:
3760
3714
 
3761
3715
 
3762
3716
  def timestamp(
3763
- scheduler: Optional[abc.SchedulerBase] = None,
3717
+ scheduler: abc.SchedulerBase | None = None,
3764
3718
  ) -> Callable[[Observable[_T]], Observable["Timestamp[_T]"]]:
3765
3719
  """The timestamp operator.
3766
3720
 
@@ -3784,8 +3738,8 @@ def timestamp(
3784
3738
 
3785
3739
  def timeout(
3786
3740
  duetime: typing.AbsoluteOrRelativeTime,
3787
- other: Optional[Observable[_T]] = None,
3788
- scheduler: Optional[abc.SchedulerBase] = None,
3741
+ other: Observable[_T] | None = None,
3742
+ scheduler: abc.SchedulerBase | None = None,
3789
3743
  ) -> Callable[[Observable[_T]], Observable[_T]]:
3790
3744
  """Returns the source observable sequence or the other observable
3791
3745
  sequence if duetime elapses.
@@ -3822,9 +3776,9 @@ def timeout(
3822
3776
 
3823
3777
 
3824
3778
  def timeout_with_mapper(
3825
- first_timeout: Optional[Observable[Any]] = None,
3826
- timeout_duration_mapper: Optional[Callable[[_T], Observable[Any]]] = None,
3827
- other: Optional[Observable[_T]] = None,
3779
+ first_timeout: Observable[Any] | None = None,
3780
+ timeout_duration_mapper: Callable[[_T], Observable[Any]] | None = None,
3781
+ other: Observable[_T] | None = None,
3828
3782
  ) -> Callable[[Observable[_T]], Observable[_T]]:
3829
3783
  """Returns the source observable sequence, switching to the other
3830
3784
  observable sequence if a timeout is signaled.
@@ -3865,7 +3819,7 @@ if TYPE_CHECKING:
3865
3819
 
3866
3820
 
3867
3821
  def time_interval(
3868
- scheduler: Optional[abc.SchedulerBase] = None,
3822
+ scheduler: abc.SchedulerBase | None = None,
3869
3823
  ) -> Callable[[Observable[_T]], Observable["TimeInterval[_T]"]]:
3870
3824
  """Records the time interval between consecutive values in an
3871
3825
  observable sequence.
@@ -3891,8 +3845,8 @@ def time_interval(
3891
3845
 
3892
3846
 
3893
3847
  def to_dict(
3894
- key_mapper: Mapper[_T, _TKey], element_mapper: Optional[Mapper[_T, _TValue]] = None
3895
- ) -> Callable[[Observable[_T]], Observable[Dict[_TKey, _TValue]]]:
3848
+ key_mapper: Mapper[_T, _TKey], element_mapper: Mapper[_T, _TValue] | None = None
3849
+ ) -> Callable[[Observable[_T]], Observable[dict[_TKey, _TValue]]]:
3896
3850
  """Converts the observable sequence to a Map if it exists.
3897
3851
 
3898
3852
  Args:
@@ -3913,7 +3867,7 @@ def to_dict(
3913
3867
 
3914
3868
 
3915
3869
  def to_future(
3916
- future_ctor: Optional[Callable[[], "Future[_T]"]] = None,
3870
+ future_ctor: Callable[[], "Future[_T]"] | None = None,
3917
3871
  ) -> Callable[[Observable[_T]], "Future[_T]"]:
3918
3872
  """Converts an existing observable sequence to a Future.
3919
3873
 
@@ -3932,7 +3886,7 @@ def to_future(
3932
3886
  return to_future_(future_ctor)
3933
3887
 
3934
3888
 
3935
- def to_iterable() -> Callable[[Observable[_T]], Observable[List[_T]]]:
3889
+ def to_iterable() -> Callable[[Observable[_T]], Observable[list[_T]]]:
3936
3890
  """Creates an iterable from an observable sequence.
3937
3891
 
3938
3892
  There is also an alias called ``to_list``.
@@ -3951,7 +3905,7 @@ to_list = to_iterable
3951
3905
 
3952
3906
 
3953
3907
  def to_marbles(
3954
- timespan: typing.RelativeTime = 0.1, scheduler: Optional[abc.SchedulerBase] = None
3908
+ timespan: typing.RelativeTime = 0.1, scheduler: abc.SchedulerBase | None = None
3955
3909
  ) -> Callable[[Observable[Any]], Observable[str]]:
3956
3910
  """Convert an observable sequence into a marble diagram string.
3957
3911
 
@@ -3969,7 +3923,7 @@ def to_marbles(
3969
3923
  return to_marbles(scheduler=scheduler, timespan=timespan)
3970
3924
 
3971
3925
 
3972
- def to_set() -> Callable[[Observable[_T]], Observable[Set[_T]]]:
3926
+ def to_set() -> Callable[[Observable[_T]], Observable[set[_T]]]:
3973
3927
  """Converts the observable sequence to a set.
3974
3928
 
3975
3929
  Returns:
@@ -4112,7 +4066,7 @@ def window_toggle(
4112
4066
 
4113
4067
 
4114
4068
  def window_with_count(
4115
- count: int, skip: Optional[int] = None
4069
+ count: int, skip: int | None = None
4116
4070
  ) -> Callable[[Observable[_T]], Observable[Observable[_T]]]:
4117
4071
  """Projects each element of an observable sequence into zero or more
4118
4072
  windows which are produced based on element count information.
@@ -4146,8 +4100,8 @@ def window_with_count(
4146
4100
 
4147
4101
  def window_with_time(
4148
4102
  timespan: typing.RelativeTime,
4149
- timeshift: Optional[typing.RelativeTime] = None,
4150
- scheduler: Optional[abc.SchedulerBase] = None,
4103
+ timeshift: typing.RelativeTime | None = None,
4104
+ scheduler: abc.SchedulerBase | None = None,
4151
4105
  ) -> Callable[[Observable[_T]], Observable[Observable[_T]]]:
4152
4106
  from ._windowwithtime import window_with_time_
4153
4107
 
@@ -4157,7 +4111,7 @@ def window_with_time(
4157
4111
  def window_with_time_or_count(
4158
4112
  timespan: typing.RelativeTime,
4159
4113
  count: int,
4160
- scheduler: Optional[abc.SchedulerBase] = None,
4114
+ scheduler: abc.SchedulerBase | None = None,
4161
4115
  ) -> Callable[[Observable[_T]], Observable[Observable[_T]]]:
4162
4116
  from ._windowwithtimeorcount import window_with_time_or_count_
4163
4117
 
@@ -4229,7 +4183,7 @@ def zip(*args: Observable[Any]) -> Callable[[Observable[Any]], Observable[Any]]:
4229
4183
 
4230
4184
  def zip_with_iterable(
4231
4185
  second: Iterable[_T2],
4232
- ) -> Callable[[Observable[_T1]], Observable[Tuple[_T1, _T2]]]:
4186
+ ) -> Callable[[Observable[_T1]], Observable[tuple[_T1, _T2]]]:
4233
4187
  """Merges the specified observable sequence and list into one
4234
4188
  observable sequence by creating a tuple whenever all of
4235
4189
  the observable sequences have produced an element at a