Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/utils/lib/hashp.js
blob: a12537537d4f4b5173f4e063f2fa52b3e8d52949 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
var Hash = require("hash").Hash;

// HashP : Case Preserving hash, used for headers

var HashP = exports.HashP = {};

HashP.get = function(hash, key) {
    var ikey = _findKey(hash, key);
    if (ikey !== null)
        return hash[ikey];
    // not found
    return undefined;
}

HashP.set = function(hash, key, value) {
    // do case insensitive search, and delete if present
    var ikey = _findKey(hash, key);
    if (ikey && ikey !== key)
        delete hash[ikey];
    // set it, preserving key case
    hash[key] = value;
}

HashP.unset = function(hash, key) {
    // do case insensitive search, and delete if present
    var ikey = _findKey(hash, key),
        value;
    if (ikey) {
        value = hash[ikey];
        delete hash[ikey];
    }
    return value;
}

HashP.includes = function(hash, key) {
    return HashP.get(hash, key) !== undefined
}

HashP.merge = function(hash, other) {
    var merged = {};
    if (hash) HashP.update(merged, hash);
    if (other) HashP.update(merged, other);
    return merged;
}

HashP.update = function(hash, other) {
    for (var key in other)
        HashP.set(hash, key, other[key]);
    return hash;
}

HashP.forEach = Hash.forEach;
HashP.map = Hash.map;

var _findKey = function(hash, key) {
    // optimization
    if (hash[key] !== undefined)
        return key;
    // case insensitive search
    var key = key.toLowerCase();
    for (var i in hash)
        if (i.toLowerCase() === key)
            return i;
    return null;
}