#!/usr/bin/env bash

shopt -s lastpipe
set -x

: "${BASH_VERSION}"

wait_explicit_pids="${1}"
test_procsubs="${2}"

declare -a pid_set=()
if [[ ${test_procsubs} == 'false' ]]; then
  sleep 8 & pid_set[${!}]=''
  sleep 6 & pid_set[${!}]=''
  sleep 4 & pid_set[${!}]=''
  sleep 2 & pid_set[${!}]=''
else
  : <( sleep 8; ); pid_set[${!}]=''
  : <( sleep 6; ); pid_set[${!}]=''
  : <( sleep 4; ); pid_set[${!}]=''
  : <( sleep 2; ); pid_set[${!}]=''
fi
SECONDS=0
: child_pids="${!pid_set[*]}" \$\!=${!}
if [[ ${wait_explicit_pids} == 'true' ]]; then
  while
    wait -n -p terminated_pid -- "${!pid_set[@]}"
    save_q="${?}"
    : termination status ${save_q} at ${SECONDS} seconds
    : ${terminated_pid:-no pid} terminated
    unset pid_set[terminated_pid]
    (( ${#pid_set[@]} > 0 && save_q == 0 ))
  do :; done
else
  while
    wait -n -p terminated_pid
    save_q="${?}"
    : termination status ${save_q} at ${SECONDS} seconds
    : ${terminated_pid:-no pid} terminated
    (( save_q == 0 ))
  do :; done
fi
