-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
125 lines (86 loc) · 2.27 KB
/
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
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import immutable from 'object-path-immutable';
export { reducer };
export { select };
export var actions = {
update: update,
invalidate: invalidate,
};
// === @SECTION: action types === //
var UPDATE = 'simplesmiler/redux-cache/UPDATE';
var INVALIDATE = 'simplesmiler/redux-cache/INVALIDATE';
// === @SECTION: actions === //
function update(subtype, id, data) {
return {
type: UPDATE,
subtype: subtype,
id: id,
data: data,
};
}
function invalidate(subtype, id, keys) {
return {
type: INVALIDATE,
subtype: subtype,
id: id,
keys: keys,
};
}
// === @SECTION: reducer factory === //
function reducer(subtype) {
var initialState = {};
return reduce;
function reduce(state, action) {
// @NOTE: bootstrap state
if (state === undefined) return initialState;
// @NOTE: ignore actions for other subtypes
if (action.subtype !== subtype) return state;
// @NOTE: do stuff
if (action.type === UPDATE) return reduceUpdate(state, action);
if (action.type === INVALIDATE) return reduceInvalidate(state, action);
// @NOTE: ignore foreign actions
return state;
}
}
// === @SECTION: shared reducers === //
// @ASSERT: subtype is correct
function reduceUpdate(state, action) {
var valid = Object.keys(action.data).reduce(setToTrue, {});
state = immutable.assign(state, [action.id], action.data);
state = immutable.assign(state, [action.id, 'valid'], valid);
return state;
}
// @ASSERT: subtype is correct
function reduceInvalidate(state, action) {
var valid = action.keys.reduce(setToFalse, {});
state = immutable.assign(state, [action.id, 'valid'], valid);
return state;
}
// === @SECTION: select === //
function select(cache, id, keys) {
var result = {
id: id,
ready: {},
};
var entity = cache[id];
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
if (entity !== undefined && entity[key] !== undefined) {
result[key] = entity[key];
result.ready[key] = true;
} else {
result.ready[key] = false;
}
}
return result;
}
// === @SECTION: exports === //
// @NOTE: mutable
function setToTrue(state, key) {
state[key] = true;
return state;
}
// @NOTE: mutable
function setToFalse(state, key) {
state[key] = false;
return state;
}