@@ -77,6 +77,19 @@ function getMethod (logic, engine, methodName, above) {
77
77
}
78
78
}
79
79
80
+ const comparisons = {
81
+ '<' : ( a , b ) => a < b ,
82
+ '<=' : ( a , b ) => a <= b ,
83
+ '>' : ( a , b ) => a > b ,
84
+ '>=' : ( a , b ) => a >= b ,
85
+ // eslint-disable-next-line eqeqeq
86
+ '==' : ( a , b ) => a == b ,
87
+ '===' : ( a , b ) => a === b ,
88
+ // eslint-disable-next-line eqeqeq
89
+ '!=' : ( a , b ) => a != b ,
90
+ '!==' : ( a , b ) => a !== b
91
+ }
92
+
80
93
/**
81
94
* Macro-type replacements to lift inefficient logic into more efficient forms.
82
95
*/
@@ -101,6 +114,38 @@ function checkIdioms (logic, engine, above) {
101
114
}
102
115
}
103
116
117
+ // Hyper-Optimizations for Comparison Operators.
118
+ for ( const comparison in comparisons ) {
119
+ if ( logic [ comparison ] && Array . isArray ( logic [ comparison ] ) && engine . methods [ comparison ] [ OriginalImpl ] ) {
120
+ const comparisonFunc = comparisons [ comparison ]
121
+ if ( logic [ comparison ] . length === 2 ) {
122
+ const [ a , b ] = logic [ comparison ]
123
+ const A = optimize ( a , engine , above )
124
+ const B = optimize ( b , engine , above )
125
+ if ( typeof A === 'function' && typeof B === 'function' ) return ( data , abv ) => comparisonFunc ( A ( data , abv ) , B ( data , abv ) )
126
+ if ( typeof A === 'function' ) return ( data , abv ) => comparisonFunc ( A ( data , abv ) , B )
127
+ if ( typeof B === 'function' ) return ( data , abv ) => comparisonFunc ( A , B ( data , abv ) )
128
+ return ( ) => comparisonFunc ( A , B )
129
+ }
130
+
131
+ if ( logic [ comparison ] . length === 3 ) {
132
+ const [ a , b , c ] = logic [ comparison ]
133
+ const A = optimize ( a , engine , above )
134
+ const B = optimize ( b , engine , above )
135
+ const C = optimize ( c , engine , above )
136
+ let prev
137
+ if ( typeof A === 'function' && typeof B === 'function' && typeof C === 'function' ) return ( data , abv ) => comparisonFunc ( A ( data , abv ) , ( prev = B ( data , abv ) ) ) && comparisonFunc ( prev , C ( data , abv ) )
138
+ if ( typeof A === 'function' && typeof B === 'function' ) return ( data , abv ) => comparisonFunc ( A ( data , abv ) , ( prev = B ( data , abv ) ) ) && comparisonFunc ( prev , C )
139
+ if ( typeof A === 'function' && typeof C === 'function' ) return ( data , abv ) => comparisonFunc ( A ( data , abv ) , B ) && comparisonFunc ( B , C ( data , abv ) )
140
+ if ( typeof B === 'function' && typeof C === 'function' ) return ( data , abv ) => comparisonFunc ( A , ( prev = B ( data , abv ) ) ) && comparisonFunc ( prev , C ( data , abv ) )
141
+ if ( typeof A === 'function' ) return ( data , abv ) => comparisonFunc ( A ( data , abv ) , B ) && comparisonFunc ( B , C )
142
+ if ( typeof B === 'function' ) return ( data , abv ) => comparisonFunc ( A , ( prev = B ( data , abv ) ) ) && comparisonFunc ( prev , C )
143
+ if ( typeof C === 'function' ) return ( data , abv ) => comparisonFunc ( A , B ) && comparisonFunc ( B , C ( data , abv ) )
144
+ return ( ) => comparisonFunc ( A , B ) && comparisonFunc ( B , C )
145
+ }
146
+ }
147
+ }
148
+
104
149
if ( logic . reduce && Array . isArray ( logic . reduce ) ) {
105
150
let [ root , mapper , defaultValue ] = logic . reduce
106
151
if ( mapper [ '+' ] && mapper [ '+' ] . length === 2 && ( mapper [ '+' ] [ 0 ] || 0 ) . var && ( mapper [ '+' ] [ 1 ] || 0 ) . var ) {
0 commit comments