#!/usr/bin/env bash

set -eu

declare -A OPTS=(
    [ count     | c :=i # repeat count              ]=1
    [ sleep     | i @=f # interval time             ]=
    [ paragraph | p ?   # print newline after cycle ]=
    [ trace     | x !   # trace execution           ]=
    [ debug     | d     # debug level               ]=0
    [ message   | m %=(^(BEGIN|END)=) # print message at BEGIN|END ]=
)
trace() { [[ $2 ]] && set -x || set +x ; }

. "$(dirname $0)"/getoptlong.sh OPTS "$@"

column=$(command -v column) || column=cat
(( debug >= 3 )) && dumpopt=(--all) filter=$column
(( debug >= 2 )) && getoptlong dump ${dumpopt[@]} | ${filter:-cat} >&2

[[ ${1:-} =~ ^[0-9]+$ ]] && count=$1 && shift

message() { [[ -v message[$1] ]] && echo "${message[$1]}" || : ; }

message BEGIN
for (( i = 0; $# > 0 && i < count ; i++ )) ; do
    (( debug > 0 )) && echo "# [ ${@@Q} ]" >&2
    "$@"
    [[ -v paragraph ]] && echo "$paragraph"
    if (( ${#sleep[@]} > 0 )) ; then
	time="${sleep[$(( i % ${#sleep[@]} ))]}"
	(( debug > 0 )) && echo "# sleep $time" >&2
	sleep $time
    fi
done
message END