python-iterutils 0.2.9__tar.gz → 0.2.10.1__tar.gz

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-iterutils
3
- Version: 0.2.9
3
+ Version: 0.2.10.1
4
4
  Summary: Python another itertools.
5
5
  Home-page: https://github.com/ChenyangGao/python-modules/tree/main/python-iterutils
6
6
  License: MIT
@@ -2,7 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
- __version__ = (0, 2, 9)
5
+ __version__ = (0, 2, 10)
6
6
  __all__ = [
7
7
  "Yield", "YieldFrom", "GenStep", "GenStepIter", "iterable",
8
8
  "async_iterable", "run_gen_step", "run_gen_step_iter",
@@ -11,8 +11,8 @@ __all__ = [
11
11
  "chunked", "foreach", "async_foreach", "through", "async_through",
12
12
  "flatten", "async_flatten", "collect", "async_collect",
13
13
  "group_collect", "async_group_collect", "iter_unique",
14
- "async_iter_unique", "wrap_iter", "wrap_aiter", "acc_step",
15
- "cut_iter", "bfs_gen", "context", "backgroud_loop",
14
+ "async_iter_unique", "wrap_iter", "wrap_aiter", "peek_iter", "peek_aiter",
15
+ "acc_step", "cut_iter", "bfs_gen", "context", "backgroud_loop",
16
16
  ]
17
17
 
18
18
  from asyncio import create_task, sleep as async_sleep
@@ -588,22 +588,30 @@ def chain[T](
588
588
  iterable: Iterable[T],
589
589
  /,
590
590
  *iterables: Iterable[T],
591
- threaded: bool = False,
591
+ threaded: Literal[False] = False,
592
592
  ) -> Iterator[T]:
593
593
  ...
594
594
  @overload
595
+ def chain[T](
596
+ iterable: Iterable[T],
597
+ /,
598
+ *iterables: Iterable[T] | AsyncIterable[T],
599
+ threaded: Literal[True],
600
+ ) -> AsyncIterator[T]:
601
+ ...
602
+ @overload
595
603
  def chain[T](
596
604
  iterable: AsyncIterable[T],
597
605
  /,
598
606
  *iterables: Iterable[T] | AsyncIterable[T],
599
- threaded: bool = False,
607
+ threaded: Literal[False, True] = False,
600
608
  ) -> AsyncIterator[T]:
601
609
  ...
602
610
  def chain[T](
603
611
  iterable: Iterable[T] | AsyncIterable[T],
604
612
  /,
605
613
  *iterables: Iterable[T] | AsyncIterable[T],
606
- threaded: bool = False,
614
+ threaded: Literal[False, True] = False,
607
615
  ) -> Iterator[T] | AsyncIterator[T]:
608
616
  if (not threaded and
609
617
  isinstance(iterable, Iterable) and
@@ -616,7 +624,7 @@ def chain[T](
616
624
  @overload
617
625
  def chain_from_iterable[T](
618
626
  iterables: Iterable[Iterable[T]],
619
- threaded: Literal[False] = False,
627
+ threaded: bool = False,
620
628
  *,
621
629
  async_: Literal[False] = False,
622
630
  ) -> Iterator[T]:
@@ -635,7 +643,7 @@ def chain_from_iterable[T](
635
643
  *,
636
644
  async_: Literal[False, True] = False,
637
645
  ) -> Iterator[T] | AsyncIterator[T]:
638
- if async_ or threaded or not isinstance(iterables, Iterable):
646
+ if async_ or not isinstance(iterables, Iterable):
639
647
  if isinstance(iterables, Iterable):
640
648
  return async_chain.from_iterable(iterables, threaded=threaded)
641
649
  else:
@@ -650,7 +658,17 @@ def chunked[T](
650
658
  iterable: Iterable[T],
651
659
  n: int = 1,
652
660
  /,
653
- threaded: bool = False,
661
+ *,
662
+ threaded: Literal[False] = False,
663
+ ) -> Iterator[Sequence[T]]:
664
+ ...
665
+ @overload
666
+ def chunked[T](
667
+ iterable: Iterable[T],
668
+ n: int = 1,
669
+ /,
670
+ *,
671
+ threaded: Literal[True],
654
672
  ) -> Iterator[Sequence[T]]:
655
673
  ...
656
674
  @overload
@@ -658,14 +676,16 @@ def chunked[T](
658
676
  iterable: AsyncIterable[T],
659
677
  n: int = 1,
660
678
  /,
661
- threaded: bool = False,
679
+ *,
680
+ threaded: Literal[False, True] = False,
662
681
  ) -> AsyncIterator[Sequence[T]]:
663
682
  ...
664
683
  def chunked[T](
665
684
  iterable: Iterable[T] | AsyncIterable[T],
666
685
  n: int = 1,
667
686
  /,
668
- threaded: bool = False,
687
+ *,
688
+ threaded: Literal[False, True] = False,
669
689
  ) -> Iterator[Sequence[T]] | AsyncIterator[Sequence[T]]:
670
690
  """
671
691
  """
@@ -768,7 +788,17 @@ def flatten(
768
788
  iterable: Iterable,
769
789
  /,
770
790
  exclude_types: type | tuple[type, ...] = (Buffer, str),
771
- threaded: bool = False,
791
+ *,
792
+ threaded: Literal[False] = False,
793
+ ) -> Iterator:
794
+ ...
795
+ @overload
796
+ def flatten(
797
+ iterable: Iterable,
798
+ /,
799
+ exclude_types: type | tuple[type, ...] = (Buffer, str),
800
+ *,
801
+ threaded: Literal[True],
772
802
  ) -> Iterator:
773
803
  ...
774
804
  @overload
@@ -776,14 +806,15 @@ def flatten(
776
806
  iterable: AsyncIterable,
777
807
  /,
778
808
  exclude_types: type | tuple[type, ...] = (Buffer, str),
779
- threaded: bool = False,
809
+ *,
810
+ threaded: Literal[False, True] = False,
780
811
  ) -> AsyncIterator:
781
812
  ...
782
813
  def flatten(
783
814
  iterable: Iterable | AsyncIterable,
784
815
  /,
785
816
  exclude_types: type | tuple[type, ...] = (Buffer, str),
786
- threaded: bool = False,
817
+ threaded: Literal[False, True] = False,
787
818
  ) -> Iterator | AsyncIterator:
788
819
  """
789
820
  """
@@ -819,7 +850,8 @@ def collect[K, V](
819
850
  iterable: Iterable[tuple[K, V]] | Mapping[K, V],
820
851
  /,
821
852
  rettype: Callable[[Iterable[tuple[K, V]]], MutableMapping[K, V]],
822
- threaded: bool = False,
853
+ *,
854
+ threaded: Literal[False] = False,
823
855
  ) -> MutableMapping[K, V]:
824
856
  ...
825
857
  @overload
@@ -827,15 +859,35 @@ def collect[T](
827
859
  iterable: Iterable[T],
828
860
  /,
829
861
  rettype: Callable[[Iterable[T]], Collection[T]] = list,
830
- threaded: bool = False,
862
+ *,
863
+ threaded: Literal[False] = False,
831
864
  ) -> Collection[T]:
832
865
  ...
833
866
  @overload
867
+ def collect[K, V](
868
+ iterable: Iterable[tuple[K, V]] | Mapping[K, V],
869
+ /,
870
+ rettype: Callable[[Iterable[tuple[K, V]]], MutableMapping[K, V]],
871
+ *,
872
+ threaded: Literal[True],
873
+ ) -> Coroutine[Any, Any, MutableMapping[K, V]]:
874
+ ...
875
+ @overload
876
+ def collect[T](
877
+ iterable: Iterable[T],
878
+ /,
879
+ rettype: Callable[[Iterable[T]], Collection[T]] = list,
880
+ *,
881
+ threaded: Literal[True],
882
+ ) -> Coroutine[Any, Any, Collection[T]]:
883
+ ...
884
+ @overload
834
885
  def collect[K, V](
835
886
  iterable: AsyncIterable[tuple[K, V]],
836
887
  /,
837
888
  rettype: Callable[[Iterable[tuple[K, V]]], MutableMapping[K, V]],
838
- threaded: bool = False,
889
+ *,
890
+ threaded: Literal[False, True] = False,
839
891
  ) -> Coroutine[Any, Any, MutableMapping[K, V]]:
840
892
  ...
841
893
  @overload
@@ -843,14 +895,16 @@ def collect[T](
843
895
  iterable: AsyncIterable[T],
844
896
  /,
845
897
  rettype: Callable[[Iterable[T]], Collection[T]] = list,
846
- threaded: bool = False,
898
+ *,
899
+ threaded: Literal[False, True] = False,
847
900
  ) -> Coroutine[Any, Any, Collection[T]]:
848
901
  ...
849
902
  def collect(
850
903
  iterable: Iterable | AsyncIterable | Mapping,
851
904
  /,
852
905
  rettype: Callable[[Iterable], Collection] = list,
853
- threaded: bool = False,
906
+ *,
907
+ threaded: Literal[False, True] = False,
854
908
  ) -> Collection | Coroutine[Any, Any, Collection]:
855
909
  """
856
910
  """
@@ -997,22 +1051,33 @@ def iter_unique[T](
997
1051
  iterable: Iterable[T],
998
1052
  /,
999
1053
  seen: None | MutableSet = None,
1000
- threaded: bool = False,
1054
+ *,
1055
+ threaded: Literal[False] = False,
1001
1056
  ) -> Iterator[T]:
1002
1057
  ...
1003
1058
  @overload
1059
+ def iter_unique[T](
1060
+ iterable: Iterable[T],
1061
+ /,
1062
+ seen: None | MutableSet = None,
1063
+ *,
1064
+ threaded: Literal[True],
1065
+ ) -> AsyncIterator[T]:
1066
+ ...
1067
+ @overload
1004
1068
  def iter_unique[T](
1005
1069
  iterable: AsyncIterable[T],
1006
1070
  /,
1007
1071
  seen: None | MutableSet = None,
1008
- threaded: bool = False,
1072
+ *,
1073
+ threaded: Literal[False, True] = False,
1009
1074
  ) -> AsyncIterator[T]:
1010
1075
  ...
1011
1076
  def iter_unique[T](
1012
1077
  iterable: Iterable[T] | AsyncIterable[T],
1013
1078
  /,
1014
1079
  seen: None | MutableSet = None,
1015
- threaded: bool = False,
1080
+ threaded: Literal[False, True] = False,
1016
1081
  ) -> Iterator[T] | AsyncIterator[T]:
1017
1082
  """
1018
1083
  """
@@ -1052,14 +1117,27 @@ def wrap_iter[T](
1052
1117
  /,
1053
1118
  callprev: None | Callable[[T], Any] = None,
1054
1119
  callnext: None | Callable[[T], Any] = None,
1120
+ *,
1121
+ threaded: Literal[False] = False,
1055
1122
  ) -> Iterator[T]:
1056
1123
  ...
1057
1124
  @overload
1125
+ def wrap_iter[T](
1126
+ iterable: Iterable[T],
1127
+ /,
1128
+ callprev: None | Callable[[T], Any] = None,
1129
+ callnext: None | Callable[[T], Any] = None,
1130
+ *,
1131
+ threaded: Literal[True],
1132
+ ) -> AsyncIterator[T]:
1133
+ ...
1134
+ @overload
1058
1135
  def wrap_iter[T](
1059
1136
  iterable: AsyncIterable[T],
1060
1137
  /,
1061
1138
  callprev: None | Callable[[T], Any] = None,
1062
1139
  callnext: None | Callable[[T], Any] = None,
1140
+ threaded: Literal[False, True] = False,
1063
1141
  ) -> AsyncIterator[T]:
1064
1142
  ...
1065
1143
  def wrap_iter[T](
@@ -1067,14 +1145,16 @@ def wrap_iter[T](
1067
1145
  /,
1068
1146
  callprev: None | Callable[[T], Any] = None,
1069
1147
  callnext: None | Callable[[T], Any] = None,
1148
+ threaded: bool = False,
1070
1149
  ) -> Iterator[T] | AsyncIterator[T]:
1071
1150
  """
1072
1151
  """
1073
- if not isinstance(iterable, Iterable):
1152
+ if threaded or not isinstance(iterable, Iterable):
1074
1153
  return wrap_aiter(
1075
1154
  iterable,
1076
1155
  callprev=callprev,
1077
1156
  callnext=callnext,
1157
+ threaded=threaded,
1078
1158
  )
1079
1159
  if not callable(callprev):
1080
1160
  callprev = None
@@ -1105,6 +1185,55 @@ async def wrap_aiter[T](
1105
1185
  callnext and await callnext(e)
1106
1186
 
1107
1187
 
1188
+ @overload
1189
+ def peek_iter[T](
1190
+ iterable: Iterable[T],
1191
+ /,
1192
+ threaded: Literal[False] = False,
1193
+ ) -> None | Iterator[T]:
1194
+ ...
1195
+ @overload
1196
+ def peek_iter[T](
1197
+ iterable: Iterable[T],
1198
+ /,
1199
+ threaded: Literal[True],
1200
+ ) -> Coroutine[Any, Any, None | AsyncIterator[T]]:
1201
+ ...
1202
+ @overload
1203
+ def peek_iter[T](
1204
+ iterable: AsyncIterable[T],
1205
+ /,
1206
+ threaded: Literal[False, True] = False,
1207
+ ) -> Coroutine[Any, Any, None | AsyncIterator[T]]:
1208
+ ...
1209
+ def peek_iter[T](
1210
+ iterable: Iterable[T] | AsyncIterable[T],
1211
+ /,
1212
+ threaded: Literal[False, True] = False,
1213
+ ) -> None | Iterator[T] | Coroutine[Any, Any, None | AsyncIterator[T]]:
1214
+ if threaded or isinstance(iterable, AsyncIterable):
1215
+ return peek_aiter(iterable, threaded=threaded)
1216
+ try:
1217
+ it = iter(iterable)
1218
+ first = next(it)
1219
+ return chain((first,), it)
1220
+ except StopIteration:
1221
+ return None
1222
+
1223
+
1224
+ async def peek_aiter[T](
1225
+ iterable: Iterable[T] | AsyncIterable[T],
1226
+ /,
1227
+ threaded: Literal[False, True] = False,
1228
+ ) -> None | AsyncIterator[T]:
1229
+ try:
1230
+ it = ensure_aiter(iterable, threaded=threaded)
1231
+ first = await anext(it)
1232
+ return async_chain((first,), it)
1233
+ except StopAsyncIteration:
1234
+ return None
1235
+
1236
+
1108
1237
  def acc_step(
1109
1238
  start: int,
1110
1239
  stop: None | int = None,
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-iterutils"
3
- version = "0.2.9"
3
+ version = "0.2.10.1"
4
4
  description = "Python another itertools."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"