"""Module providing the ParallelOp class for concurrent operation execution."""

from .base_op import BaseOp


class ParallelOp(BaseOp):
    """Operation class that executes multiple sub-operations in parallel."""

    async def execute(self):
        """Executes all sub-operations concurrently using asynchronous tasks."""
        for op in self.sub_ops:
            assert op.async_mode
            self.submit_async_task(op.call, context=self.context)
        return await self.join_async_tasks()

    def execute_sync(self):
        """Executes all sub-operations concurrently using synchronous task management."""
        for op in self.sub_ops:
            assert not op.async_mode
            self.submit_sync_task(op.call_sync, context=self.context)
        return self.join_sync_tasks()

    def __lshift__(self, op: dict[str, BaseOp] | list[BaseOp] | BaseOp):
        """Raises RuntimeError as the shift operator is not supported for parallel operations."""
        raise RuntimeError(f"`<<` is not supported in `{self.name}`")

    def __or__(self, op: BaseOp):
        """Adds sub-operations to the current parallel group using the bitwise OR operator."""
        if isinstance(op, ParallelOp) and op.sub_ops:
            self.add_sub_ops(op.sub_ops)
        else:
            self.add_sub_op(op)
        return self
