2626
2727 RuleEngine . prototype . register = function ( rules ) {
2828
29- if ( typeof ( rules ) == "string" ) {
30-
31- rules = JSON . parse ( rules ) ;
32-
33- }
34-
35-
29+
3630 if ( rules instanceof Array ) {
3731
38- rules = rules . map ( function ( rule ) {
39-
40- rule . condition = eval ( "(" + rule . condition + ")" ) ;
41- return rule ;
42-
43- } ) ;
44-
4532 this . rules = this . rules . concat ( rules ) ;
4633
4734 } else if ( rules !== null && typeof ( rules ) == "object" ) {
4835
49- rules . condition = eval ( "(" + rules . condition + ")" ) ;
50-
5136 this . rules . push ( rules ) ;
5237
5338 }
7661
7762 //these new attributes have to be in both last session and current session to support
7863 // the compare function
79- fact . complete = false ;
64+ var complete = false ;
8065 fact . result = true ;
8166
8267 var session = _ . clone ( fact ) ;
8368 var lastSession = _ . clone ( fact ) ;
8469 var _rules = this . activeRules ;
8570
8671
87-
8872 ( function doit ( x ) {
8973
90- if ( x < _rules . length && session . complete === false ) {
9174
92- var _rule = _rules [ x ] . condition ;
75+ var R = { } ;
76+
77+ R . when = function ( outcome ) {
78+
79+ if ( outcome ) {
9380
94- _rule . call ( session , function ( outcome ) {
95-
96- if ( outcome ) {
81+ var _consequence = _rules [ x ] . consequence ;
82+ _consequence . call ( session , R ) ;
9783
98- var _consequence = _rules [ x ] . consequence ;
99-
100- _consequence . call ( session , function ( ) {
84+ } else {
10185
102- if ( ! _ . isEqual ( lastSession , session ) ) {
86+ process . nextTick ( function ( ) {
87+ R . next ( ) ;
88+ } ) ;
10389
104- lastSession = _ . clone ( session ) ;
105- process . nextTick ( function ( ) {
106- return doit ( 0 ) ;
107- } ) ;
90+ }
91+
92+ }
10893
109- } else {
110-
111- process . nextTick ( function ( ) {
112- return doit ( x + 1 ) ;
113- } ) ;
114-
115- }
94+ R . restart = function ( ) {
11695
117- } ) ;
96+ return doit ( 0 ) ;
11897
119- } else {
98+ } ;
12099
121- process . nextTick ( function ( ) {
122- return doit ( x + 1 ) ;
123- } ) ;
100+ R . stop = function ( ) {
124101
125- }
102+ complete = true ;
103+ return doit ( 0 ) ;
126104
127-
128- } ) ;
105+ } ;
106+
107+ R . next = function ( ) {
108+
109+ if ( ! _ . isEqual ( lastSession , session ) ) {
110+
111+ lastSession = _ . clone ( session ) ;
112+ process . nextTick ( function ( ) {
113+ R . restart ( ) ;
114+ } ) ;
115+
116+ } else {
117+
118+ process . nextTick ( function ( ) {
119+ return doit ( x + 1 ) ;
120+ } ) ;
121+
122+ }
123+
124+ }
125+
126+ if ( x < _rules . length && complete === false ) {
127+
128+ var _rule = _rules [ x ] . condition ;
129+ _rule . call ( session , R ) ;
129130
130131 } else {
132+
131133 process . nextTick ( function ( ) {
132134 return callback ( session ) ;
133135 } ) ;
136+
134137 }
135138
136139 } ) ( 0 ) ;
202205
203206 this . init ( ) ;
204207
208+ if ( typeof ( rules ) == "string" ) {
209+
210+ rules = JSON . parse ( rules ) ;
211+
212+ }
213+
214+ if ( rules instanceof Array ) {
215+
216+ rules = rules . map ( function ( rule ) {
217+
218+ rule . condition = eval ( "(" + rule . condition + ")" ) ;
219+ return rule ;
220+
221+ } ) ;
222+
223+ } else if ( rules !== null && typeof ( rules ) == "object" ) {
224+
225+ rules . condition = eval ( "(" + rules . condition + ")" ) ;
226+
227+ }
228+
205229 this . register ( rules ) ;
206230
207231 } ;
208232
233+
234+
209235 module . exports = RuleEngine ;
210236
211237} ( module . exports ) ) ;
0 commit comments