#!/usr/bin/env bash

main () {

  printf 'bash %s\n' "${BASH_VERSION}"

  SECONDS=0

  explicit_pids="${1}"
  enable_job_control="${2}"
  
  local -
  set -o nounset -o noglob +o braceexpand
  if [[ ${enable_job_control} == 'true' ]]; then
    set -o monitor
  else
    set +o monitor
  fi

  local -a pid_set

  random_sleep &
  pid_set[${!}]=''
  random_sleep &
  pid_set[${!}]=''
  random_sleep &
  pid_set[${!}]=''
  random_sleep &
  pid_set[${!}]=''
  random_sleep &
  pid_set[${!}]=''

  local -i processes_forked=5
  local -i processes_waited=0

  local terminated_pid
  while
    if [[ ${explicit_pids} == 'true' ]]; then
      wait -n -p terminated_pid -- "${!pid_set[@]}"
    else
      wait -n -p terminated_pid
    fi
  do
    unset pid_set[${terminated_pid}]
    (( ++processes_waited ))
    random_sleep &
    pid_set[${!}]=''
    (( ++processes_forked ))
    random_sleep
  done

  printf '%s processes waited / %s processes forked\n' "${processes_waited}" "${processes_forked}"
  printf '%s seconds\n' "${SECONDS}"

}

random_sleep () {
  local random
  printf -v random '%03d' "${SRANDOM}"
  sleep -- "0.0${random: -3}"
}

main "${@}"
