Source code for majis.misc.events

"""Events module."""

from operator import attrgetter

from planetary_coverage.events.event import (
    AbstractEvent,
    EventsDict,
    EventsList,
)


[docs] def flatten(events: tuple | list | EventsList | EventsDict | AbstractEvent) -> EventsList: """Flatten multi events object.""" if isinstance(events, tuple | list | EventsList | EventsDict): return EventsList( sorted( [ ev for event in events for ev in ( flatten(event) if isinstance(event, EventsList | EventsDict) else [event] ) ], key=attrgetter('start'), ) ) if isinstance(events, AbstractEvent): return EventsList([events]) raise TypeError(f'Invalid events type: `{type(events)}`')
[docs] def group(events: tuple | list | EventsList | EventsDict) -> EventsDict: """Group events by observation name.""" if isinstance(events, tuple | list | EventsList): return EventsDict(events) if isinstance(events, EventsDict): return events raise TypeError(f'Invalid events type: `{type(events)}`')
[docs] def concatenate( *events: EventsList | EventsDict, flat: bool = False, overlap: bool = False ) -> EventsList | EventsDict: """Concatenate ITL events. Note ---- By default, concatenated blocks must not overlap each other. This can be disable with `overlap=True`. """ blocks = flatten(events) if blocks and not overlap: previous = blocks[0] for block in blocks[1:]: if block.start < previous.stop: raise ValueError(f'Overlap between `{previous}` and `{block}`') previous = block return blocks if flat else group(blocks)
[docs] def flatten_events(func): """Events flatten decorator. Mainly used as a prolog before saving files. """ def wrapper( fout: ..., *events: EventsList | EventsDict, overlap: bool = False, **kwargs, ): """Concatenate events blocks before the calling the main function.""" blocks = concatenate(*events, flat=True, overlap=overlap) return func(fout, *blocks, **kwargs) return wrapper