
# Section: exection

___x_cmd_ccmd_which_(){
     [ "$#" -ne 0 ] || {
        ccmd:error "Please provide command to locate the cache."
        return 1
    }

    local filepath="${___X_CMD_CCMD_CACHE:-$___X_CMD_CCMD_CACHEPATH_DEFAULT}"
    local IFS=""; ___X_CMD_CCMD_WHICH_="$filepath/$(___x_cmd_ccmd___md5 "$@")"
    # TODO: whether to find out [ -f "$___X_CMD_CCMD_WHICH_" ] ...
}

___x_cmd_ccmd_which(){
    local ___X_CMD_CCMD_WHICH_=
    ___x_cmd_ccmd_which_ "$@" || return
    printf "%s\n" "$___X_CMD_CCMD_WHICH_"
}

___x_cmd_ccmd_invalidate(){
    if [ $# -eq 0 ]; then
        [ -n "$___X_CMD_CCMD_EXEC_LAST_FP" ]    || return 0
        [ -f "$___X_CMD_CCMD_EXEC_LAST_FP" ]    || return 0
        ___x_cmd_cmds_rm -f "$___X_CMD_CCMD_EXEC_LAST_FP"
        return
    fi

    local ___X_CMD_CCMD_WHICH_=
    ___x_cmd_ccmd_which_ "$@" || return

    ccmd:debug "Removing cache file for: $*"
    # printf "%s\n" "$filepath"

    [ ! -f "$___X_CMD_CCMD_WHICH_" ] || ___x_cmd_cmds_rm "$___X_CMD_CCMD_WHICH_"
}

___x_cmd_ccmd_clear(){
    local FILEPATH="${___X_CMD_CCMD_CACHE:-$___X_CMD_CCMD_CACHEPATH_DEFAULT}"
    # zsh rm -f requires confirmation
    [ -d "$FILEPATH" ] || return
    [ -z "$(___x_cmd_cmds_ls "$FILEPATH")" ] || ___x_cmd_cmds_rm -f "$FILEPATH/"*
}

# EndSection

# Section: object

# If you want a new environment for script
___x_cmd_ccmd_setup(){
    ___X_CMD_CCMD_CACHE="${1:-"$(mktemp)"}"
    x mkdirp "$___X_CMD_CCMD_CACHE"
}

# Remember teardown if you have setup
___x_cmd_ccmd_teardown(){
    x rmrf "$___X_CMD_CCMD_CACHE"
    unset ___X_CMD_CCMD_CACHE
}

# EndSection

___x_cmd_ccmd___md5(){
    local IFS=" "
    if [ $# -eq 0 ]; then
        ___x_cmd str md5
    else
        ___x_cmd str md5 "$*"
    fi
}
