Skip to content

Commit c40e99d

Browse files
committed
WIP: refactor evaluator / getter to be functional
1 parent fd15e1a commit c40e99d

17 files changed

+617
-337
lines changed

grunt/karma.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ module.exports = {
2323
webpack: {
2424
module: {
2525
loaders: [
26-
{ test: /\.js$/, loader: 'jstransform-loader' },
26+
{ test: /\.js$/, loader: 'babel-loader' },
2727
],
2828
},
2929
},
@@ -37,6 +37,10 @@ module.exports = {
3737
autoWatch: false,
3838

3939
singleRun: true,
40+
41+
client: {
42+
captureConsole: false,
43+
},
4044
},
4145

4246
phantom: {
@@ -66,7 +70,7 @@ module.exports = {
6670
webpack: {
6771
module: {
6872
loaders: [
69-
{ test: /\.js$/, loader: 'jstransform-loader' },
73+
{ test: /\.js$/, loader: 'babel-loader' },
7074
],
7175
postLoaders: [
7276
{

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
"stateless"
2828
],
2929
"dependencies": {
30-
"immutable": "^3.7.3"
30+
"immutable": "^3.7.3",
31+
"babel-core": "^5.8.29",
32+
"babel-loader": "^5.3.2"
3133
},
3234
"devDependencies": {
3335
"grunt": "^0.4.5",

src/getter.js

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import Immutable from 'immutable'
2+
import { List } from 'immutable'
3+
14
var isFunction = require('./utils').isFunction
25
var isArray = require('./utils').isArray
36
var isKeyPath = require('./key-path').isKeyPath
@@ -36,6 +39,36 @@ function getDeps(getter) {
3639
return getter.slice(0, getter.length - 1)
3740
}
3841

42+
/**
43+
* Returns an array of deps from a getter and all its deps
44+
* @param {Getter} getter
45+
* @param {Immutable.Set} existing
46+
* @return {Immutable.Set}
47+
*/
48+
function getFlattenedDeps(getter, existing) {
49+
if (!existing) {
50+
existing = Immutable.Set()
51+
}
52+
53+
const toAdd = Immutable.Set().withMutations(set => {
54+
if (!isGetter(getter)) {
55+
throw new Error('getFlattenedDeps must be passed a Getter')
56+
}
57+
58+
getDeps(getter).forEach(function(dep) {
59+
if (isKeyPath(dep)) {
60+
set.add(List(dep))
61+
} else if (isGetter(dep)) {
62+
set.union(getFlattenedDeps(dep))
63+
} else {
64+
throw new Error('Invalid getter, each dependency must be a KeyPath or Getter')
65+
}
66+
})
67+
})
68+
69+
return existing.union(toAdd)
70+
}
71+
3972
/**
4073
* @param {KeyPath}
4174
* @return {Getter}
@@ -48,10 +81,35 @@ function fromKeyPath(keyPath) {
4881
return [keyPath, identity]
4982
}
5083

84+
/**
85+
* Adds non enumerated __storeDeps property
86+
* @param {Getter}
87+
*/
88+
function getStoreDeps(getter) {
89+
if (getter.hasOwnProperty('__storeDeps')) {
90+
return getter.__storeDeps
91+
}
92+
93+
const storeDeps = getFlattenedDeps(getter)
94+
.map(keyPath => keyPath.first())
95+
.filter(x => !!x)
96+
97+
98+
Object.defineProperty(getter, '__storeDeps', {
99+
enumerable: false,
100+
configurable: false,
101+
writable: false,
102+
value: storeDeps,
103+
})
104+
105+
return storeDeps
106+
}
51107

52-
module.exports = {
53-
isGetter: isGetter,
54-
getComputeFn: getComputeFn,
55-
getDeps: getDeps,
56-
fromKeyPath: fromKeyPath,
108+
export {
109+
isGetter,
110+
getComputeFn,
111+
getFlattenedDeps,
112+
getStoreDeps,
113+
getDeps,
114+
fromKeyPath,
57115
}

src/main.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Store from './store'
12
var helpers = require('./immutable-helpers')
23

34
/**
@@ -8,7 +9,7 @@ exports.Reactor = require('./reactor')
89
/**
910
* @return {Store}
1011
*/
11-
exports.Store = require('./store')
12+
exports.Store = Store
1213

1314
// export the immutable library
1415
exports.Immutable = require('immutable')

src/reactor-state.js

Lines changed: 0 additions & 124 deletions
This file was deleted.

0 commit comments

Comments
 (0)