code: def select(*signals: Signal, **kwargs) -> List[Signal]:
      
      class CleanUp(Interrupt):
          pass
  
      timeout = kwargs.get("timeout", None)
      if not isinstance(timeout, (float, int, type(None))):
          raise ValueError("The timeout keyword parameter can be either None or a number.")
  
      def wait_one(signal: Signal, common: Signal) -> None:
          try:
              signal.wait()
              common.turn_on()
          except CleanUp:
              pass
  
      # We simply sets up multiple sub-processes respectively waiting for one of the signals. Once one of them has fired,
      # the others will all run no-op eventually, so no need for any explicit clean-up.
      common = Signal(name=local.name + "-selector").turn_off()
      if _logger is not None:
          _log(INFO, "select", "select", "select", signals=[sig.name for sig in signals])
      procs = []
      for signal in signals:
          procs.append(add(wait_one, signal, common))
  
      try:
          common.wait(timeout)
      finally:
          for proc in procs:  # Clean up the support processes.
              proc.interrupt(CleanUp())
  
      return [signal for signal in signals if signal.is_on]
docs: Allows the current process to wait for multiple concurrent signals. Waits until one of the signals turns on, at
      which point this signal is returned.
  
      :param timeout:
          If this parameter is not ``None``, it is taken as a delay at the end of which the process times out, and
          stops waiting on the set of :py:class:`Signal`s. In such a situation, a :py:class:`Timeout` exception is raised
          on the process.