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
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()