# shellcheck shell=dash
___x_cmd_fifo___main(){
    local op="$1"; [ "$#" -eq 0 ] || shift
    case "$op" in
        make|producer|consumer|consumer_)
            ___x_cmd_fifo_"$op" "$@"
        ;;

        *)  ___x_cmd_fifo_help
        ;;
    esac
}

# x fifo new abc
# x fifo path abc
# $(x fifo path abc)

# fifo consumer
# fifo producer

___x_cmd_fifo_help(){
    x help -m fifo >&2
    return 1
}

___x_cmd_fifo_make(){
    local p="${1:?path}"; shift

    [ ! -e "$p" ] || {
        command mkfifo "$p"
        return 0
    }

    [ ! -p "$p" ] || return 0

    x:error "File already existed but not pipe file. Please remove the file or request with diffenrent name."
    return 1
}

___x_cmd_fifo_consumer(){
    local p="${1}"; shift
    (
        [ "$___X_CMD_SHELL" != bash ] || shopt -s expand_aliases
        "$@"
    ) <"$p" &
}

___x_cmd_fifo_consumer_(){
    local p; p="$___X_CMD_ROOT_TMP/fifo/$(x date vlid).$(x rand uuid)"
    x_=

    x ensurefp "$p"
    ___x_cmd_cmds mkfifo "$p" ||  N=fifo M="Fail to create fifo [file=$p]" log:ret:1

    (
        {
            trap 'x rmrf "$p"' EXIT
            [ "$___X_CMD_SHELL" != bash ] || shopt -s expand_aliases
            "$@"
        } <"$p" &
    )
    x:debug "fifo file [x_=$p]"
    x_="$p"
}

___x_cmd_fifo_producer(){
    local p="${1:?path}"; shift
    (
        [ "$___X_CMD_SHELL" != bash ] || shopt -s expand_aliases
        "$@"
    ) >"$p" &
}
