# shellcheck shell=dash

# alias ___x_cmd_line_no='cat -n'
___x_cmd_line_no() {
    awk '{ print NR ": " $0  }' "${1:--}"
}

___x_cmd_line_every(){
    # default is: awk "NR%2==0{ print \$0;  }" "${1:--}"
    awk "NR%${1:-2}==${2:-0}{ print \$0;  }" -
}

# From file.exits_or_append
___x_cmd_line_exist_or_append() {
    if [ $# -eq 0 ]; then
        echo "show help" >&2
    elif [ $# -eq 1 ]; then
        local string_to_append="$1"
        tee /dev/stdout /dev/stderr 2>(
            if ! grep -F --quiet "$string_to_append"; then
                echo "$string_to_append"
            fi
        )
    elif [ $# -eq 2 ]; then
        local filename="$1"
        local string_to_append="$2"
        grep -F --quiet "$string_to_append" "$filename" || echo "$string_to_append" >>"$filename"
    fi
}

if [ -n "$ZSH_VERSION" ] || [ -n "$BASH_VERSION" ]; then

    # Only works for zsh bash
    ___x_cmd_line_to_array(){
        local name=${1:?Array name} line
        shift
        if [ $# -eq 0 ]; then
            while read -r line; do
                eval "$name+=(\"\$line\")"
            done # <<< "$(cat -)"
        else
            while [ $# -gt 0 ]; do
                while read -r line; do
                    eval "$name+=(\"\$line\")"
                done <"$1"
                shift
            done
        fi
    }

    str_trim(){
        local var="$*"
        # remove leading whitespace characters
        var="${var#"${var%%[![:space:]]*}"}"
        # remove trailing whitespace characters
        var="${var%"${var##*[![:space:]]}"}"
        echo -n "$var"
    }

    ___x_cmd_line_to_array_trim(){
        # TODO: local IFS
        local name=${1:?Array name}
        local line arr=()
        while read -r line; do
            line="$(str_trim "$line")"
            arr+=("$line")
        done <<< "$(cat -)"
        eval "$name"'=("${arr[@]}")'
    }

    ___x_cmd_line_to_array_trim_ignore_empty(){
        # TODO: local IFS
        local name=${1:?Array name}
        local line arr=()
        while read -r line; do
            line="$(str_trim "$line")"
            [ "$line" = "" ] && continue
            arr+=("$line")
        done <<< "$(cat -)"
        eval "$name"'=("${arr[@]}")'
    }

fi
