mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			44 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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
 | 
