mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			49 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | 
 | ||
|  | _NOT_SET = object() | ||
|  | 
 | ||
|  | 
 | ||
|  | def peek_and_iter(items): | ||
|  |     if not items: | ||
|  |         return None, None | ||
|  |     items = iter(items) | ||
|  |     try: | ||
|  |         peeked = next(items) | ||
|  |     except StopIteration: | ||
|  |         return None, None | ||
|  |     def chain(): | ||
|  |         yield peeked | ||
|  |         yield from items | ||
|  |     return chain(), peeked | ||
|  | 
 | ||
|  | 
 | ||
|  | def iter_many(items, onempty=None): | ||
|  |     if not items: | ||
|  |         if onempty is None: | ||
|  |             return | ||
|  |         if not callable(onempty): | ||
|  |             raise onEmpty | ||
|  |         items = onempty(items) | ||
|  |         yield from iter_many(items, onempty=None) | ||
|  |         return | ||
|  |     items = iter(items) | ||
|  |     try: | ||
|  |         first = next(items) | ||
|  |     except StopIteration: | ||
|  |         if onempty is None: | ||
|  |             return | ||
|  |         if not callable(onempty): | ||
|  |             raise onEmpty | ||
|  |         items = onempty(items) | ||
|  |         yield from iter_many(items, onempty=None) | ||
|  |     else: | ||
|  |         try: | ||
|  |             second = next(items) | ||
|  |         except StopIteration: | ||
|  |             yield first, False | ||
|  |             return | ||
|  |         else: | ||
|  |             yield first, True | ||
|  |             yield second, True | ||
|  |         for item in items: | ||
|  |             yield item, True |