python-iterutils 0.2.8__tar.gz → 0.2.10__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.8
3
+ Version: 0.2.10
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, 8)
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
@@ -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
  """
@@ -700,7 +720,8 @@ def foreach(
700
720
  else:
701
721
  for arg in iterable:
702
722
  value(arg)
703
- return async_foreach(value, iterable, *iterables, threaded=threaded)
723
+ else:
724
+ return async_foreach(value, iterable, *iterables, threaded=threaded)
704
725
 
705
726
 
706
727
  async def async_foreach(
@@ -731,7 +752,7 @@ def through(
731
752
  """
732
753
  if threaded or not isinstance(iterable, Iterable):
733
754
  return async_through(iterable, take_while, threaded=threaded)
734
- if take_while is None:
755
+ elif take_while is None:
735
756
  for _ in iterable:
736
757
  pass
737
758
  else:
@@ -767,7 +788,17 @@ def flatten(
767
788
  iterable: Iterable,
768
789
  /,
769
790
  exclude_types: type | tuple[type, ...] = (Buffer, str),
770
- 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],
771
802
  ) -> Iterator:
772
803
  ...
773
804
  @overload
@@ -775,14 +806,15 @@ def flatten(
775
806
  iterable: AsyncIterable,
776
807
  /,
777
808
  exclude_types: type | tuple[type, ...] = (Buffer, str),
778
- threaded: bool = False,
809
+ *,
810
+ threaded: Literal[False, True] = False,
779
811
  ) -> AsyncIterator:
780
812
  ...
781
813
  def flatten(
782
814
  iterable: Iterable | AsyncIterable,
783
815
  /,
784
816
  exclude_types: type | tuple[type, ...] = (Buffer, str),
785
- threaded: bool = False,
817
+ threaded: Literal[False, True] = False,
786
818
  ) -> Iterator | AsyncIterator:
787
819
  """
788
820
  """
@@ -818,7 +850,8 @@ def collect[K, V](
818
850
  iterable: Iterable[tuple[K, V]] | Mapping[K, V],
819
851
  /,
820
852
  rettype: Callable[[Iterable[tuple[K, V]]], MutableMapping[K, V]],
821
- threaded: bool = False,
853
+ *,
854
+ threaded: Literal[False] = False,
822
855
  ) -> MutableMapping[K, V]:
823
856
  ...
824
857
  @overload
@@ -826,15 +859,35 @@ def collect[T](
826
859
  iterable: Iterable[T],
827
860
  /,
828
861
  rettype: Callable[[Iterable[T]], Collection[T]] = list,
829
- threaded: bool = False,
862
+ *,
863
+ threaded: Literal[False] = False,
830
864
  ) -> Collection[T]:
831
865
  ...
832
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
833
885
  def collect[K, V](
834
886
  iterable: AsyncIterable[tuple[K, V]],
835
887
  /,
836
888
  rettype: Callable[[Iterable[tuple[K, V]]], MutableMapping[K, V]],
837
- threaded: bool = False,
889
+ *,
890
+ threaded: Literal[False, True] = False,
838
891
  ) -> Coroutine[Any, Any, MutableMapping[K, V]]:
839
892
  ...
840
893
  @overload
@@ -842,14 +895,16 @@ def collect[T](
842
895
  iterable: AsyncIterable[T],
843
896
  /,
844
897
  rettype: Callable[[Iterable[T]], Collection[T]] = list,
845
- threaded: bool = False,
898
+ *,
899
+ threaded: Literal[False, True] = False,
846
900
  ) -> Coroutine[Any, Any, Collection[T]]:
847
901
  ...
848
902
  def collect(
849
903
  iterable: Iterable | AsyncIterable | Mapping,
850
904
  /,
851
905
  rettype: Callable[[Iterable], Collection] = list,
852
- threaded: bool = False,
906
+ *,
907
+ threaded: Literal[False, True] = False,
853
908
  ) -> Collection | Coroutine[Any, Any, Collection]:
854
909
  """
855
910
  """
@@ -996,22 +1051,33 @@ def iter_unique[T](
996
1051
  iterable: Iterable[T],
997
1052
  /,
998
1053
  seen: None | MutableSet = None,
999
- threaded: bool = False,
1054
+ *,
1055
+ threaded: Literal[False] = False,
1000
1056
  ) -> Iterator[T]:
1001
1057
  ...
1002
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
1003
1068
  def iter_unique[T](
1004
1069
  iterable: AsyncIterable[T],
1005
1070
  /,
1006
1071
  seen: None | MutableSet = None,
1007
- threaded: bool = False,
1072
+ *,
1073
+ threaded: Literal[False, True] = False,
1008
1074
  ) -> AsyncIterator[T]:
1009
1075
  ...
1010
1076
  def iter_unique[T](
1011
1077
  iterable: Iterable[T] | AsyncIterable[T],
1012
1078
  /,
1013
1079
  seen: None | MutableSet = None,
1014
- threaded: bool = False,
1080
+ threaded: Literal[False, True] = False,
1015
1081
  ) -> Iterator[T] | AsyncIterator[T]:
1016
1082
  """
1017
1083
  """
@@ -1051,14 +1117,27 @@ def wrap_iter[T](
1051
1117
  /,
1052
1118
  callprev: None | Callable[[T], Any] = None,
1053
1119
  callnext: None | Callable[[T], Any] = None,
1120
+ *,
1121
+ threaded: Literal[False] = False,
1054
1122
  ) -> Iterator[T]:
1055
1123
  ...
1056
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
1057
1135
  def wrap_iter[T](
1058
1136
  iterable: AsyncIterable[T],
1059
1137
  /,
1060
1138
  callprev: None | Callable[[T], Any] = None,
1061
1139
  callnext: None | Callable[[T], Any] = None,
1140
+ threaded: Literal[False, True] = False,
1062
1141
  ) -> AsyncIterator[T]:
1063
1142
  ...
1064
1143
  def wrap_iter[T](
@@ -1066,14 +1145,16 @@ def wrap_iter[T](
1066
1145
  /,
1067
1146
  callprev: None | Callable[[T], Any] = None,
1068
1147
  callnext: None | Callable[[T], Any] = None,
1148
+ threaded: bool = False,
1069
1149
  ) -> Iterator[T] | AsyncIterator[T]:
1070
1150
  """
1071
1151
  """
1072
- if not isinstance(iterable, Iterable):
1152
+ if threaded or not isinstance(iterable, Iterable):
1073
1153
  return wrap_aiter(
1074
1154
  iterable,
1075
1155
  callprev=callprev,
1076
1156
  callnext=callnext,
1157
+ threaded=threaded,
1077
1158
  )
1078
1159
  if not callable(callprev):
1079
1160
  callprev = None
@@ -1104,6 +1185,55 @@ async def wrap_aiter[T](
1104
1185
  callnext and await callnext(e)
1105
1186
 
1106
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
+
1107
1237
  def acc_step(
1108
1238
  start: int,
1109
1239
  stop: None | int = None,
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "python-iterutils"
3
- version = "0.2.8"
3
+ version = "0.2.10"
4
4
  description = "Python another itertools."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"