Staggering iterable operations

Hey all! Here is a simple class for staggering list operations over multiple frames!
It’s not a new concept; found in SolarLune’s xEmitter, but it’s some food for development :slight_smile:
Supported datatypes:

  • LIST
  • DICT
  • TUPLE
import random



class stagger:
    
    def __init__(self):
        self.tasks = {}
    
    def append(self, task, operation, interval):
        """Appends a list and cuts into chunks
        :param task: list / tuple / dict to operate on,
        :param operation: callback function to execute logic,
        :param interval: size of chunk to cut,
        """
        
        task_number = len(task)
        
        task_type = type(task)
        
        if task_type == list:
        
            task_chunks = [task[i:i+interval] for i in range(0, task_number, interval)]
        
        elif task_type == dict:
            
            task_chunks = [{key:task[key] for key in [k for k in task.keys()][i:i+interval]} for i in range(0, task_number, interval)]
        
        else:
            
            return
        
        random_key = random.randint(0, 10000)
        
        if not random_key in self.tasks:
            
            self.tasks[random_key] = [task_chunks, operation]
            
    def update(self): 
        """Called every frame to execute staggering
        """
        remove_tasks = []
        
        for key, (task, operation) in self.tasks.items():
            
            try:
                
                first_item = task[0]
                
                operation(first_item)
                
                task.remove(first_item)
             
            except Exception as e:
                
                remove_tasks.append(key)

        for item in remove_tasks:
            self.tasks.pop(item)
            
            
# Example usage #####################################

stagger_function = stagger() # Invoke stagger class (should be done only once, then made global)

my_items  = [i for i in range(20)] # Data type to iterate (DICT, LIST or TUPLE)

def printer(task_list): # Callback function to operate on each chunk
    for items in task_list:
        print(items)
    print()
    
stagger_function.append(my_items, printer, 5) # Add task to staggerer

# Run this every frame, but in this case, as it is run as a script
# Use a for loop
for i in range(len(my_items)):
    stagger_function.update()