import {Constructor} from '../../../../types/util';
import type AsyncProcess from '../abstract/asyncProcess';
import AsyncProcessPool from '../abstract/asyncProcessPool';
import type RootProcess from './rootProcess';
import RootProcessContext from './rootProcessContext';

/**
 * @inheritdoc
 */
class RootProcessPool<
  Process extends RootProcess
> extends AsyncProcessPool<MapProcessProvider<Process>, Process> {

  /**
   * Constructs instance
   * @param constructor process constructor
   * @param options additional options
   */
  constructor(constructor: Constructor<Process>, options: AsyncProcessPool.Options<Process>) {
    super((poolContext, args) => {
      let context = new RootProcessContext(poolContext);
      return {
        context,
        args,
        process: new constructor(context)
      } as AsyncProcessPool.ConstructedProcess<any>;
    }, options);
  }
}

export default RootProcessPool;

type MapProcessProvider<
  Process extends RootProcess
> = (
  context: AsyncProcessPool.Context,
  args: [...args: AsyncProcess.Arguments<Process>]
) => AsyncProcessPool.ConstructedProcess<Process>;
