# shellcheck shell=dash disable=2016
___x_cmd_cd_util___head(){
    local x_="$1"
    [ -n "$x_" ] || ___x_cmd_cd_history___maxnum_get_
    cd:debug "head [num=$x_]"
    local l=; local i=0; while read -r l; do
        i=$((i+1))
        [ "$i" -le "$x_" ] || break
        printf "%s\n" "$l"
    done
}

# ___x_cmd_cmds_awk '!a[$0]++'
___x_cmd_cd_util___uniq(){
    LC_ALL="$___X_CMD_LOCALE_DEF_C" ___x_cmd_cmds_awk '
($0 != ""){
    line = $0
    gsub("\000", "", line)
    if ( ! a[line]++ ) print line;
}
'
}

___x_cmd_cd_util___reverse(){
    LC_ALL="$___X_CMD_LOCALE_DEF_C" ___x_cmd_cmds_awk '
{   data[ ++l ] = $0;   }
END{
    for (i=l; i>=1; --i) print data[i];
}
'
}

# Section: ldict
___x_cmd_cd_util___dict_set(){
    local name="$1"; shift
    ___x_cmd_cd_util___dict_inner unshift "$name" "$@"
    ___x_cmd ensurefp "$___X_CMD_CD_DATA/$name"
    ___x_cmd_cd_util___dict_inner print "$name" > "$___X_CMD_CD_DATA/$name"
}

___x_cmd_cd_util___dict_get_(){
    local name="$1"
    local key="$2"
    x_=""
    ___x_cmd_cd_util___dict_inner has "$name" "$key" || ___x_cmd_cd_util___dict_inner load "$name" "$___X_CMD_CD_DATA/$name" || return $?
    ___x_cmd_cd_util___dict_get_inner_ "$name" "$key"
}

___x_cmd_cd_util___dict_get_inner_(){
    local name="$1"
    local key="$2"
    local ___X_CMD_LDICT_GET_=
    x_=""; ___x_cmd_cd_util___dict_inner get_ "$name" "$key" || return $?
    x_="$___X_CMD_LDICT_GET_"
}

___x_cmd_cd_util___dict_rm(){
    local name="$1"
    local key="$2"
    ___x_cmd_cd_util___dict_inner has "$name" "$key"    || return 0
    ___x_cmd_cd_util___dict_inner rm "$name" "$key"     || return $?
    ___x_cmd ensurefp "$___X_CMD_CD_DATA/$name"
    ___x_cmd_cd_util___dict_inner print "$name" > "$___X_CMD_CD_DATA/$name"
}

___x_cmd_cd_util___dict_inner(){
    local op="$1"; local name="$2"; shift 2
    ___x_cmd ldict "$op" ___X_CMD_CD_DATA_DICT_"$name" "$@"
}

# EndSection
