docs: def process(*args, **kwargs):
      """Runs the decorated function in a concurrent process,
      taking care of the result and error management.
  
      Decorated functions will return a concurrent.futures.Future object
      once called.
  
      The timeout parameter will set a maximum execution time
      for the decorated function. If the execution exceeds the timeout,
      the process will be stopped and the Future will raise TimeoutError.
  
      """
      timeout = kwargs.get('timeout')
  
      # decorator without parameters
      if len(args) == 1 and len(kwargs) == 0 and callable(args[0]):
          return _process_wrapper(args[0], timeout)
      else:
          # decorator with parameters
          if timeout is not None and not isinstance(timeout, (int, float)):
              raise TypeError('Timeout expected to be None or integer or float')
  
          def decorating_function(function):
              return _process_wrapper(function, timeout)
  
          return decorating_function