@@ -77,6 +77,27 @@ function getMethod (logic, engine, methodName, above) {
7777 }
7878}
7979
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+
80101/**
81102 * Processes the logic for the engine once so that it doesn't need to be traversed again.
82103 * @param {* } logic
@@ -92,6 +113,9 @@ export function optimize (logic, engine, above = []) {
92113 } ;
93114
94115 if ( logic && typeof logic === 'object' ) {
116+ const idiomEnhancement = checkIdioms ( logic , engine , above )
117+ if ( idiomEnhancement ) return idiomEnhancement
118+
95119 const keys = Object . keys ( logic )
96120 const methodName = keys [ 0 ]
97121
0 commit comments