#!/usr/bin/env bash

set -o nounset -o noglob +o braceexpand
shopt -s lastpipe

main () {

  declare -p BASH_VERSION

  SECONDS=0

  explicit_pids="${1:-false}"

  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 "${@}"
