## library of useful functions, usually prefixed with '_' ## ## ARRAY Functions ## function _array_contains { local -n array=$1 local element=$2 [[ " ${array[@]} " =~ " ${element} " ]] && return 0 || return 1 } function _array_intersect { local -n arr1=$1 local -n arr2=$2 local -n result=$3 declare -A include for item in "${arr2[@]}"; do include["$item"]=1; done result=() for item in "${arr1[@]}"; do [[ -n ${include["$item"]} ]] && result+=("$item"); done } function _array_subtract { local -n arr1=$1 # First array local -n arr2=$2 # Array to subtract local -n result=$3 # Output array [[ ${#arr2[@]} == 0 ]] && result=("${arr1[@]}") && return declare -A exclude for item in "${arr2[@]}"; do exclude["$item"]=1; done result=() for item in "${arr1[@]}"; do [[ -z ${exclude["$item"]} ]] && result+=("$item"); done } ## ## TEXT Functions ## function _pluralize_simple { echo -n "$1 " [[ $1 -eq 1 || $1 -eq -1 ]] && echo ${2} || echo ${2}s } ## ## READ Functions ## function _confirm_destructive { local message="${1:-This cannot be undone!}" echo "⚠️ WARNING: $message" read -p "Type YES to confirm: " response case "$response" in [yY][eE][sS] | [yY]) return 0 ;; *) echo "canceled!" && return 1 ;; esac }