-
Notifications
You must be signed in to change notification settings - Fork 84
/
hash.js
92 lines (73 loc) · 1.81 KB
/
hash.js
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/** internal
* class Hash
*
* Thin wraper over Object used internally to keep lists of processors.
**/
'use strict';
// 3rd-party
var _ = require('lodash');
////////////////////////////////////////////////////////////////////////////////
/**
* new Hash(defaulter)
* - defaulter (Function): default value generator
**/
function Hash(defaulter) {
this.data = {};
this.defaulter = defaulter;
}
/**
* Hash#get(key) -> Mixed
* - key (String):
*
* Returns value associated with given key:
*
* processors.get('text/css').push(DirectiveProcessor);
*
* Associates key with value generated by `defaulter` if it does not exists
* yet.
**/
Hash.prototype.get = function (key) {
if (!this.data[key]) {
this.data[key] = this.defaulter(key);
}
return this.data[key];
};
/**
* Hash#set(key, val) -> Void
* - key (String):
* - val (Mixed):
*
* Set value for a key:
*
* old_val = processors.get('text/css');
* new_val = _.without(old_val, MyMegaProcessor);
* processors.set('text/css', new_val);
*
* Used to reset value of a key.
**/
Hash.prototype.set = function (key, val) {
this.data[key] = val || this.defaulter(key);
};
/**
* Hash#clone() -> Hash
*
* Makes a copy of a Hash.
*
* processors.get('text/css').length; // => 1
*
* processors_copy = processors.clone();
* processors_copy.get('text/css').push(MyMegaProcessor);
*
* processors.get('text/css').length; // => 1
* processors_copy.get('text/css').length; // => 2
*
* Used upon Environment init - clone globally registered processors
**/
Hash.prototype.clone = function () {
var clone = new Hash(this.defaulter);
Object.keys(this.data).forEach(function (key) {
clone.set(key, _.clone(this.data[key]));
}, this);
return clone;
};
module.exports = Hash;