block_to_events.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from types import SimpleNamespace
  2. from typing import Tuple
  3. def block_to_events(*args: SimpleNamespace) -> Tuple[SimpleNamespace, ...]:
  4. """
  5. Converts `args` from a block to a list of events. If `args` is already a list of event(s), returns it unmodified.
  6. Parameters
  7. ----------
  8. args : SimpleNamespace
  9. Block to be flattened into a list of events.
  10. Returns
  11. -------
  12. events : list[SimpleNamespace]
  13. List of events comprising `args` if it was a block, otherwise `args` unmodified.
  14. """
  15. if (
  16. len(args) == 1
  17. ): # args is a tuple consisting a block of events, or a single event
  18. x = args[0]
  19. if isinstance(x, (float, int)): # args is block duration
  20. events = [x]
  21. else: # args could be a block of events or a single event
  22. events = list(vars(x).values()) # Get all attrs
  23. events = list(
  24. filter(lambda filter_none: filter_none is not None, events)
  25. ) # Filter None attributes
  26. # If all attrs are either float/SimpleNamespace, args is a block of events
  27. if all([isinstance(e, (float, SimpleNamespace)) for e in events]):
  28. events = __get_label_events_if_any(
  29. *events
  30. ) # Flatten label events from dict datatype
  31. else: # Else, args is a single event
  32. events = [x]
  33. else: # args is a tuple of events
  34. events = __get_label_events_if_any(*args)
  35. return events
  36. def __get_label_events_if_any(*events: list) -> list:
  37. # Are any of the events labels? If yes, extract them from dict()
  38. final_events = []
  39. for e in events:
  40. if isinstance(e, dict): # Only labels are stored as dicts
  41. final_events.extend(e.values())
  42. else:
  43. final_events.append(e)
  44. return final_events