
# shellcheck shell=dash disable=2034
# ___x_cmd_lazyfun "<file1>" <fun1> "<file2>" <fun2>
___x_cmd_lazyfun(){
    local x_=
    while [ $# -ge 2 ]; do
        x_=; ___x_cmd_lazyfun_each_ "$1" "$2"
        eval "${x_}"
        shift 2
    done
}

___x_cmd_lazyfun_each_(){
    x_=""
    ___x_cmd_lazyfun_each_define_ "$2" "___X_CMD_LAZYFUN_FP_$2"
    x_="
    ___X_CMD_LAZYFUN_FP_${2}=\"\$1\"
    $x_
    "
}

___x_cmd_lazyfun_each_define_(){
    x_="
    $1(){
        [ -z \"\$${1}___FAIL\" ] || N=x M=\"Fail to source \$${2}\" log:ret:1

        ___x_cmd_source \"\$$2\" || N=x M=\"Fail to source \$${2}\" log:ret:1
        unset $2

        local ${1}___FAIL=1
        ${1} \"\$@\"
    }"
}

# ___x_cmd_lazyfun "<file>" <fun1> <fun2> <fun3>
# one file for multiple function ...
___x_cmd_lazysrc(){
    local file="$1"
    local funcname="$2"
    local x_=

    local code="___X_CMD_LAZYFUN_FP_${funcname}=\"\$file\""
    shift 1
    while [ $# -gt 0 ]; do
        x_=; ___x_cmd_lazyfun_each_define_ "$1" "___X_CMD_LAZYFUN_FP_${funcname}"
        code="${code}${x_}"
        shift
    done

    eval "$code"
}



