# Author:       Li Junhao           l@x-cmd.com
# shellcheck    shell=sh            disable=SC3043,SC2164     # xrc

# license:      GPLv3

# Section 5: llist: include to speed up for it is used in which_one.
___x_cmd_llist(){
    local op="$1";
    [ $# -gt 0 ] || shift
    case "$op" in
        init)           ___x_cmd_llist_init "$@" ;;
        shift)          ___x_cmd_llist_shift "$@" ;;
        shift_)         ___x_cmd_llist_shift_ "$@" ;;
        unshift)        ___x_cmd_llist_unshift "$@" ;;
        push)           ___x_cmd_llist_push "$@" ;;
        pop)            ___x_cmd_llist_pop "$@" ;;
        pop_)           ___x_cmd_llist_pop_ "$@" ;;
        has)            ___x_cmd_llist_has "$@" ;;
        print)          ___x_cmd_llist_print "$@" ;;
        ""|-h|--help)   x help -m llist "$@";;
    esac
}

___x_cmd_llist_init(){
    local name="${1:?Provide list name}"
    eval "___x_cmd_llist_$name=\"\${___X_CMD_LDICT_SEP}\""
}

___x_cmd_llist_push(){
    local name="${1:?Provide list name}"
    local value="${2:?Provide value}"

    eval "___X_CMD_LLIST_${name}=\"\${___X_CMD_LLIST_${name}:-\${___X_CMD_LDICT_SEP}}\${value}\${___X_CMD_LDICT_SEP}\""
}

___x_cmd_llist_pop_(){
    local name="${1:?Provide list name}"
    local tmp
    eval tmp="\"\${___X_CMD_LLIST_${name}%\${___X_CMD_LDICT_SEP}}\""
    ___X_CMD_LLIST_POP_="${tmp##*${___X_CMD_LDICT_SEP}}"
    eval "___X_CMD_LLIST_${name}=\"\${tmp%\$___X_CMD_LLIST_POP_}\""
}

___x_cmd_llist_pop(){
    printf "%s\n" "$(___x_cmd_llist_pop_ "$@")"
}

___x_cmd_llist_unshift(){
    local name="${1:?Provide list name}"
    local value="${2:?Provide value}"

    eval "___X_CMD_LLIST_${name}=\"\${___X_CMD_LDICT_SEP}\${value}\${___X_CMD_LLIST_${name}:-\${___X_CMD_LDICT_SEP}}\""
}

___x_cmd_llist_shift_(){
    local name="${1:?Provide list name}"
    local tmp
    eval tmp="\"\${___X_CMD_LLIST_${name}#\${___X_CMD_LDICT_SEP}}\""
    ___X_CMD_LLIST_SHIFT_="${tmp%%${___X_CMD_LDICT_SEP}*}"
    eval "___X_CMD_LLIST_${name}=\"\${tmp#\$___X_CMD_LLIST_SHIFT_}\""
}

___x_cmd_llist_shift(){
    printf "%s\n" "$(___x_cmd_llist_shift_ "$@")"
}

___x_cmd_llist_has(){
    local name="${1:?Provide dict name}"
    local value="${2:?Provide key}"

    local part1
    eval "part1=\"\${___X_CMD_LLIST_${name}#*\${___X_CMD_LDICT_SEP}\${value}\${___X_CMD_LDICT_SEP}}\""
    eval [ \"\$part1\" != \"\$"___X_CMD_LLIST_${name}"\" ]
}

___x_cmd_llist_print(){
    local name="${1:?Provide dict name}"
    eval printf \"%s\" \"\$"___X_CMD_LLIST_${name}"\" | ___x_cmd_cmds_awk -v RS="$___X_CMD_LDICT_SEP" '
NR!=1{
    print $1
}'
}
## EndSection


xrc setmain ___x_cmd_llist
