# Run something recursively over all directories.
# Usage: recursive <COMMAND>
recursive()
{
  local IFS=$'\n'
  local current="${PWD}"
  local dirs=$(find -type d)
  local total=$(find -type d | wc -l) # TODO: don't call find twice. won't work with "echo ${dirs}".
  local count=0
  local failed=0

  for dir in ${dirs}; do
    # increment counter.
    ((count++))

    # cd into the next dir.
    cd "${current}" || failed=${?}
    cd "${dir}" || failed=${?}

    # echo status.
    echo -e "${color_bblue}[${count}/${total}] ${dir}${color_default}"

    # run command.
    $* || failed=${?}
  done

  # return back on complete.
  cd "${current}" || failed=${?}

  return ${failed}
}

# Run something recursively over all directories.
# Usage: recursive1 <COMMAND>
recursive1() # TODO: create generic function.
{
  local IFS=$'\n'
  local current="${PWD}"
  local dirs=$(find -mindepth 1 -maxdepth 1 -type d)
  local total=$(find -mindepth 1 -maxdepth 1 -type d | wc -l) # TODO: don't call find twice. won't work with "echo ${dirs}".
  local count=0
  local failed=0

  for dir in ${dirs}; do
    # increment counter.
    ((count++))

    # cd into the next dir.
    cd "${current}"
    cd "${dir}"

    # echo status.
    echo -e "${color_bblue}[${count}/${total}] ${dir}${color_default}"

    # run command.
    $* || failed=${?}
  done

  # return back on complete.
  cd "${current}"

  return ${failed}
}

# autocomplete.
complete -F _autocomplete_nested recursive recursive1