const crypto = require('crypto');

exports.strtr = (str, replacements) => str.toString().replace(
    /{([^}]+)}/g, (match, key) => replacements[key] || match
);

const trim = function(str, chars, flags) {
    if(chars === undefined)
        chars = " \n\r\t\v\0";

    let start = 0,
        end = str.length;

    if(flags & 0x01)
        while(start < end && chars.indexOf(str[start]) >= 0)
            ++start;

    if(flags & 0x02)
        while(end > start && chars.indexOf(str[end - 1]) >= 0)
            --end;

    return (start > 0 || end < str.length)
        ? str.substring(start, end)
        : str;
};

exports.trimStart = (str, chars) => trim(str, chars, 0x01);
exports.trimEnd = (str, chars) => trim(str, chars, 0x02);
exports.trim = (str, chars) => trim(str, chars, 0x03);

exports.shortHash = function(text) {
    const hash = crypto.createHash('sha256');
    hash.update(text);
    return hash.digest('hex').substring(0, 8);
};