@@ -444,6 +444,11 @@ def __add__(self, collection):
444
444
return AggregateCollection ([self , collection ])
445
445
446
446
447
+ def ObjectCollectionBaseMethod (func ):
448
+ setattr (ObjectCollectionBase , func .__name__ , func )
449
+ return func
450
+
451
+
447
452
class AggregateCollection (ObjectCollectionBase ):
448
453
"""
449
454
Dynamically aggregate other collections into one chained collection
@@ -790,6 +795,7 @@ def iter_filtered(self, *preds, **filters):
790
795
return filtered (objects , preds , filters )
791
796
792
797
798
+ @ObjectCollectionBaseMethod
793
799
def grouped (sequence , key = None , transform = None ):
794
800
"""
795
801
Parse the sequence into groups, according to key:
@@ -812,6 +818,7 @@ def grouped(sequence, key=None, transform=None):
812
818
return groups
813
819
814
820
821
+ @ObjectCollectionBaseMethod
815
822
def separate (sequence , key = None ):
816
823
"""
817
824
Partition the sequence into items that match and items that don't:
@@ -860,6 +867,7 @@ def listify(obj):
860
867
return list (ilistify (obj ))
861
868
862
869
870
+ @ObjectCollectionBaseMethod
863
871
def chunkify (sequence , size ):
864
872
"""
865
873
Chunk a sequence into equal-size chunks (except for the last chunk):
@@ -984,6 +992,7 @@ def inner(*args, **kwargs):
984
992
return inner
985
993
986
994
995
+ @ObjectCollectionBaseMethod
987
996
def takesome (generator , max = None , min = 0 ):
988
997
"""
989
998
Take between ``min`` and ``max`` items from the generator.
@@ -1007,19 +1016,22 @@ def takesome(generator, max=None, min=0):
1007
1016
if max is not None and max < min :
1008
1017
raise ValueError ("'max' must be great than 'min'" )
1009
1018
1010
- items = [p for p , _ in zip (generator , range (min ))]
1019
+ generator = iter (generator ) # just in case it ain't a generator
1020
+
1021
+ min_items = [p for _ , p in zip (range (min ), generator )]
1011
1022
1012
- if len (items ) < min :
1013
- raise ValueError ("Not enough items in sequence (wanted {}, got {})" .format (min , len (items )))
1023
+ if len (min_items ) < min :
1024
+ raise ValueError ("Not enough items in sequence (wanted {}, got {})" .format (min , len (min_items )))
1014
1025
1015
- yield from items
1026
+ yield from min_items
1016
1027
1017
1028
if max is None :
1029
+ # yield the rest
1018
1030
yield from generator
1019
1031
return
1020
1032
1021
1033
remain = max - min
1022
- for p , _ in zip (generator , range (remain )):
1034
+ for _ , p in zip (range (remain ), generator ):
1023
1035
yield p
1024
1036
1025
1037
0 commit comments