# shellcheck shell=bash

# Section: Life Cycle

___x_cmd_dict_make(){
    local O="${O:?Please provide object name}"
    ___x_cmd_instance_add "dict" "$O"
    eval "___X_BASH_DICT_$O=0"
}

# alias ___x_cmd_dict_make=____x_cmd_dict_make

___x_cmd_dict_clear(){
    local O="${O:?Please provide object name}"
    eval "___X_BASH_DICT_$O=0"
}

# O=b dload "$( a.dump | dgrep "abc" | dgerp "abc" )"

___x_cmd_dict_dump(){
    local O="${O:?Please provide object name}"
    eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\""
}

___x_cmd_dict_load(){
    local O="${O:?Please provide object name}"
    eval "___X_BASH_DICT_${O}=\"$(___x_cmd_cmds_cat)\""
}

# EndSection

# Section: size get put scope remove

___x_cmd_dict_size(){
    local O="${O:?Please provide object name}"
    local data
    data="$(eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"")"

    local len
    len="${data##*${DICT_SEP}}"

    printf "%s\n" "${len:-0}"
}

___x_cmd_dict_get(){
    if [ -z "$O" ]; then
        ___x_cmd_dict___pget "$@"
        return
    fi

    : "${O:?Please provide object name}"
    eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"" | ___x_cmd_dict___pget "$@"
}

___x_cmd_dict_put(){
    if [ -z "$O" ]; then
        ___x_cmd_dict___pput "$@"
        return
    fi

    : "${O:?Please provide object name}"
    local s
    s="$(eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"" | ___x_cmd_dict___pput "$@")"

    eval "___X_BASH_DICT_$O=\"\$s\""
}

___x_cmd_dict_scope(){
    if [ -z "$O" ]; then
        ___x_cmd_dict___pscope "$@"
        return
    fi

    : "${O:?Please provide object name}"
    eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"" | ___x_cmd_dict___pscope "$@"
}

___x_cmd_dict_remove(){
    if [ -z "$O" ]; then
        ___x_cmd_dict___premove "$@"
        return
    fi

    : "${O:?Please provide object name}"
    local O="${O:?list_name}"
    local s
    if s="$(eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"" | ___x_cmd_dict___premove "$@")"; then
        eval "___X_BASH_DICT_$O=\"\$s\""
    else
        return 1
    fi
}

# EndSection

# Section: drop grep iter

___x_cmd_dict_drop(){
    if [ -z "$O" ]; then
        ___x_cmd_dict___pdrop "$@"
        return
    fi

    : "${O:?Please provide object name}"
    local O="${O:?list_name}"
    local s
    if s="$(eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"" | ___x_cmd_dict___pdrop "$@")"; then
        eval "___X_BASH_DICT_$O=\"\$s\""
    else
        return 1
    fi
}


___x_cmd_dict_grep(){
    if [ -z "$O" ]; then
        ___x_cmd_dict___pgrep "$@"
        return
    fi

    : "${O:?Please provide object name}"
    local O="${O:?list_name}"
    local s
    if s="$(eval printf "%s\\\\n" "\"\$${O}\"" | ___x_cmd_dict___pgrep "$@" -)"; then
        eval "___X_BASH_DICT_$O=\"\$s\""
    else
        return 1
    fi
}

___x_cmd_dict_grepr(){
    if [ -z "$O" ]; then
        ___x_cmd_dict___pgrepr "$@"
        return
    fi

    : "${O:?Please provide object name}"
    local O="${O:?list_name}"
    local s
    if s="$(eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"" | ___x_cmd_dict___pgrepr "$@" -)"; then
        eval "___X_BASH_DICT_$O=\"\$s\""
    else
        return 1
    fi
}

___x_cmd_dict_iter(){
    local O="${O:?Please provide object name}"
    local data
    data="$(eval printf "%s\\\\n" "\"\$___X_BASH_DICT_${O}\"")"

    local fun="$*" # "$1 \"\$key\" \"\$val\""
    if [ "$#" -eq 1 ] && command -v "$1"; then
        fun="$1 \"\$key\" \"\$val\""
    fi

    local key
    local val

    while :; do
        key="${data%%${DICT_SEP}*}"
        data="${data#*${DICT_SEP}}"
        val="${data%%${DICT_SEP}*}"
        data="${data#*${DICT_SEP}}"

        eval "$fun"
    done
}

# EndSection
