@@ -77,6 +77,27 @@ function getMethod (logic, engine, methodName, above) {
77
77
}
78
78
}
79
79
80
+ /**
81
+ * Macro-type replacements to lift inefficient logic into more efficient forms.
82
+ */
83
+ function checkIdioms ( logic , engine , above ) {
84
+ if ( logic . reduce && Array . isArray ( logic . reduce ) ) {
85
+ let [ root , mapper , defaultValue ] = logic . reduce
86
+ if ( mapper [ '+' ] && mapper [ '+' ] . length === 2 && mapper [ '+' ] [ 0 ] . var && mapper [ '+' ] [ 1 ] . var ) {
87
+ const accumulatorFound = mapper [ '+' ] [ 0 ] . var === 'accumulator' || mapper [ '+' ] [ 1 ] . var === 'accumulator'
88
+ const currentFound = mapper [ '+' ] [ 0 ] . var === 'current' || mapper [ '+' ] [ 1 ] . var === 'current'
89
+ defaultValue = defaultValue || 0
90
+ if ( accumulatorFound && currentFound ) return optimize ( { '+' : [ { '+' : root } , defaultValue ] } , engine , above )
91
+ }
92
+ if ( mapper [ '*' ] && mapper [ '*' ] . length === 2 && mapper [ '*' ] [ 0 ] . var && mapper [ '*' ] [ 1 ] . var ) {
93
+ const accumulatorFound = mapper [ '*' ] [ 0 ] . var === 'accumulator' || mapper [ '*' ] [ 1 ] . var === 'accumulator'
94
+ const currentFound = mapper [ '*' ] [ 0 ] . var === 'current' || mapper [ '*' ] [ 1 ] . var === 'current'
95
+ defaultValue = typeof defaultValue === 'undefined' ? 1 : defaultValue
96
+ if ( accumulatorFound && currentFound ) return optimize ( { '*' : [ { '*' : root } , defaultValue ] } , engine , above )
97
+ }
98
+ }
99
+ }
100
+
80
101
/**
81
102
* Processes the logic for the engine once so that it doesn't need to be traversed again.
82
103
* @param {* } logic
@@ -92,6 +113,9 @@ export function optimize (logic, engine, above = []) {
92
113
} ;
93
114
94
115
if ( logic && typeof logic === 'object' ) {
116
+ const idiomEnhancement = checkIdioms ( logic , engine , above )
117
+ if ( idiomEnhancement ) return idiomEnhancement
118
+
95
119
const keys = Object . keys ( logic )
96
120
const methodName = keys [ 0 ]
97
121
0 commit comments