/
index.js
43 lines (38 loc) 路 896 Bytes
/
index.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
var queued = '__eventsourced_object'
var supportsSymbol = false
try {
queued = Symbol(queued)
supportsSymbol = true
} catch (err) {}
module.exports = {
setup: setup,
drain: drain,
event: event,
isDirty: isDirty
}
function setup (obj, reducer, events) {
drain(obj)
if (!reducer || !events || !events.length) return obj
var r
var i = 0
var state = obj
while (events[i]) {
r = reducer(state, events[i++])
state = r === undefined ? state : r
}
return state
}
function event (obj, reducer, event) {
obj[queued][obj[queued].length] = event
var r = reducer(obj, event)
return r === undefined ? obj : r
}
function drain (obj) {
var arr = obj[queued]
if (supportsSymbol) obj[queued] = []
else Object.defineProperty(obj, queued, {enumerable: false, value: [], configurable: true})
return arr
}
function isDirty (obj) {
return !!obj[queued].length
}