
committed by
Victor Berchet

parent
a73d5308e0
commit
f693be3996
@ -44,6 +44,7 @@ export {
|
||||
pb3 as ɵpb3,
|
||||
pb4 as ɵpb4,
|
||||
pbV as ɵpbV,
|
||||
f0 as ɵf0,
|
||||
f1 as ɵf1,
|
||||
f2 as ɵf2,
|
||||
f3 as ɵf3,
|
||||
|
@ -79,6 +79,7 @@ export {
|
||||
queryRefresh as qR,
|
||||
} from './query';
|
||||
export {
|
||||
pureFunction0 as f0,
|
||||
pureFunction1 as f1,
|
||||
pureFunction2 as f2,
|
||||
pureFunction3 as f3,
|
||||
|
@ -1749,16 +1749,54 @@ function valueInData<T>(data: any[], index: number, value?: T): T {
|
||||
return value !;
|
||||
}
|
||||
|
||||
/** Gets the binding at the current bindingIndex */
|
||||
export function peekBinding(): any {
|
||||
ngDevMode && assertNotEqual(currentView.bindingStartIndex, null, 'bindingStartIndex');
|
||||
return data[bindingIndex];
|
||||
}
|
||||
|
||||
export function getCurrentQueries(QueryType: {new (): LQueries}): LQueries {
|
||||
return currentQueries || (currentQueries = new QueryType());
|
||||
}
|
||||
|
||||
export function getCreationMode(): boolean {
|
||||
return creationMode;
|
||||
}
|
||||
|
||||
/** Gets the current binding value and increments the binding index. */
|
||||
export function consumeBinding(): any {
|
||||
ngDevMode && assertDataInRange(bindingIndex);
|
||||
ngDevMode &&
|
||||
assertNotEqual(data[bindingIndex], NO_CHANGE, 'Stored value should never be NO_CHANGE.');
|
||||
return data[bindingIndex++];
|
||||
}
|
||||
|
||||
/** Updates binding if changed, then returns whether it was updated. */
|
||||
export function bindingUpdated(value: any): boolean {
|
||||
ngDevMode && assertNotEqual(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
|
||||
|
||||
if (creationMode || isDifferent(data[bindingIndex], value)) {
|
||||
creationMode && initBindings();
|
||||
data[bindingIndex++] = value;
|
||||
return true;
|
||||
} else {
|
||||
bindingIndex++;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/** Updates binding if changed, then returns the latest value. */
|
||||
export function checkAndUpdateBinding(value: any): any {
|
||||
bindingUpdated(value);
|
||||
return value;
|
||||
}
|
||||
|
||||
/** Updates 2 bindings if changed, then returns whether either was updated. */
|
||||
export function bindingUpdated2(exp1: any, exp2: any): boolean {
|
||||
const different = bindingUpdated(exp1);
|
||||
return bindingUpdated(exp2) || different;
|
||||
}
|
||||
|
||||
/** Updates 4 bindings if changed, then returns whether any was updated. */
|
||||
export function bindingUpdated4(exp1: any, exp2: any, exp3: any, exp4: any): boolean {
|
||||
const different = bindingUpdated2(exp1, exp2);
|
||||
return bindingUpdated2(exp3, exp4) || different;
|
||||
}
|
||||
|
||||
export function getPreviousOrParentNode(): LNode {
|
||||
return previousOrParentNode;
|
||||
}
|
||||
|
@ -6,105 +6,85 @@
|
||||
* found in the LICENSE file at https://angular.io/license
|
||||
*/
|
||||
|
||||
import {NO_CHANGE, bind, peekBinding} from './instructions';
|
||||
import {bindingUpdated, bindingUpdated2, bindingUpdated4, checkAndUpdateBinding, consumeBinding, getCreationMode} from './instructions';
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* If the value of the provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if the value has not changed, returns NO_CHANGE.
|
||||
* If the value hasn't been saved, calls the pure function to store and return the
|
||||
* value. If it has been saved, returns the saved value.
|
||||
*
|
||||
* @param pureFn Function that returns an updated value
|
||||
* @param exp Updated expression value
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @param pureFn Function that returns a value
|
||||
* @returns value
|
||||
*/
|
||||
export function pureFunction1(pureFn: (v: any) => any, exp: any): any {
|
||||
let different = false;
|
||||
const latestValue = exp === NO_CHANGE ? peekBinding() : exp;
|
||||
if (bind(exp) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ? pureFn(latestValue) : NO_CHANGE;
|
||||
export function pureFunction0<T>(pureFn: () => T): T {
|
||||
return getCreationMode() ? checkAndUpdateBinding(pureFn()) : consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of the provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if the value has not changed, returns cached value.
|
||||
*
|
||||
* @param pureFn Function that returns an updated value
|
||||
* @param exp Updated expression value
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction1(pureFn: (v: any) => any, exp: any): any {
|
||||
return bindingUpdated(exp) ? checkAndUpdateBinding(pureFn(exp)) : consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn
|
||||
* @param exp1
|
||||
* @param exp2
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction2(pureFn: (v1: any, v2: any) => any, exp1: any, exp2: any): any {
|
||||
let different = false;
|
||||
|
||||
const latestVal1 = exp1 === NO_CHANGE ? peekBinding() : exp1;
|
||||
if (bind(exp1) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal2 = exp2 === NO_CHANGE ? peekBinding() : exp2;
|
||||
if (bind(exp2) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ? pureFn(latestVal1, latestVal2) : NO_CHANGE;
|
||||
return bindingUpdated2(exp1, exp2) ? checkAndUpdateBinding(pureFn(exp1, exp2)) : consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn
|
||||
* @param exp1
|
||||
* @param exp2
|
||||
* @param exp3
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction3(
|
||||
pureFn: (v1: any, v2: any, v3: any) => any, exp1: any, exp2: any, exp3: any): any {
|
||||
let different = false;
|
||||
|
||||
const latestVal1 = exp1 === NO_CHANGE ? peekBinding() : exp1;
|
||||
if (bind(exp1) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal2 = exp2 === NO_CHANGE ? peekBinding() : exp2;
|
||||
if (bind(exp2) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal3 = exp3 === NO_CHANGE ? peekBinding() : exp3;
|
||||
if (bind(exp3) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ? pureFn(latestVal1, latestVal2, latestVal3) : NO_CHANGE;
|
||||
const different = bindingUpdated2(exp1, exp2);
|
||||
return bindingUpdated(exp3) || different ? checkAndUpdateBinding(pureFn(exp1, exp2, exp3)) :
|
||||
consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn
|
||||
* @param exp1
|
||||
* @param exp2
|
||||
* @param exp3
|
||||
* @param exp4
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction4(
|
||||
pureFn: (v1: any, v2: any, v3: any, v4: any) => any, exp1: any, exp2: any, exp3: any,
|
||||
exp4: any): any {
|
||||
let different = false;
|
||||
|
||||
const latestVal1 = exp1 === NO_CHANGE ? peekBinding() : exp1;
|
||||
if (bind(exp1) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal2 = exp2 === NO_CHANGE ? peekBinding() : exp2;
|
||||
if (bind(exp2) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal3 = exp3 === NO_CHANGE ? peekBinding() : exp3;
|
||||
if (bind(exp3) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal4 = exp4 === NO_CHANGE ? peekBinding() : exp4;
|
||||
if (bind(exp4) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ? pureFn(latestVal1, latestVal2, latestVal3, latestVal4) : NO_CHANGE;
|
||||
return bindingUpdated4(exp1, exp2, exp3, exp4) ?
|
||||
checkAndUpdateBinding(pureFn(exp1, exp2, exp3, exp4)) :
|
||||
consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn
|
||||
* @param exp1
|
||||
@ -112,34 +92,20 @@ export function pureFunction4(
|
||||
* @param exp3
|
||||
* @param exp4
|
||||
* @param exp5
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction5(
|
||||
pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any, exp1: any, exp2: any, exp3: any,
|
||||
exp4: any, exp5: any): any {
|
||||
let different = false;
|
||||
|
||||
const latestVal1 = exp1 === NO_CHANGE ? peekBinding() : exp1;
|
||||
if (bind(exp1) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal2 = exp2 === NO_CHANGE ? peekBinding() : exp2;
|
||||
if (bind(exp2) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal3 = exp3 === NO_CHANGE ? peekBinding() : exp3;
|
||||
if (bind(exp3) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal4 = exp4 === NO_CHANGE ? peekBinding() : exp4;
|
||||
if (bind(exp4) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal5 = exp5 === NO_CHANGE ? peekBinding() : exp5;
|
||||
if (bind(exp5) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ? pureFn(latestVal1, latestVal2, latestVal3, latestVal4, latestVal5) : NO_CHANGE;
|
||||
const different = bindingUpdated4(exp1, exp2, exp3, exp4);
|
||||
return bindingUpdated(exp5) || different ?
|
||||
checkAndUpdateBinding(pureFn(exp1, exp2, exp3, exp4, exp5)) :
|
||||
consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn
|
||||
* @param exp1
|
||||
@ -148,39 +114,20 @@ export function pureFunction5(
|
||||
* @param exp4
|
||||
* @param exp5
|
||||
* @param exp6
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction6(
|
||||
pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any, exp1: any, exp2: any,
|
||||
exp3: any, exp4: any, exp5: any, exp6: any): any {
|
||||
let different = false;
|
||||
|
||||
const latestVal1 = exp1 === NO_CHANGE ? peekBinding() : exp1;
|
||||
if (bind(exp1) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal2 = exp2 === NO_CHANGE ? peekBinding() : exp2;
|
||||
if (bind(exp2) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal3 = exp3 === NO_CHANGE ? peekBinding() : exp3;
|
||||
if (bind(exp3) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal4 = exp4 === NO_CHANGE ? peekBinding() : exp4;
|
||||
if (bind(exp4) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal5 = exp5 === NO_CHANGE ? peekBinding() : exp5;
|
||||
if (bind(exp5) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal6 = exp6 === NO_CHANGE ? peekBinding() : exp6;
|
||||
if (bind(exp6) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ?
|
||||
pureFn(latestVal1, latestVal2, latestVal3, latestVal4, latestVal5, latestVal6) :
|
||||
NO_CHANGE;
|
||||
const different = bindingUpdated4(exp1, exp2, exp3, exp4);
|
||||
return bindingUpdated2(exp5, exp6) || different ?
|
||||
checkAndUpdateBinding(pureFn(exp1, exp2, exp3, exp4, exp5, exp6)) :
|
||||
consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn
|
||||
* @param exp1
|
||||
@ -190,42 +137,21 @@ export function pureFunction6(
|
||||
* @param exp5
|
||||
* @param exp6
|
||||
* @param exp7
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction7(
|
||||
pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any, exp1: any,
|
||||
exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any): any {
|
||||
let different = false;
|
||||
|
||||
const latestVal1 = exp1 === NO_CHANGE ? peekBinding() : exp1;
|
||||
if (bind(exp1) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal2 = exp2 === NO_CHANGE ? peekBinding() : exp2;
|
||||
if (bind(exp2) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal3 = exp3 === NO_CHANGE ? peekBinding() : exp3;
|
||||
if (bind(exp3) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal4 = exp4 === NO_CHANGE ? peekBinding() : exp4;
|
||||
if (bind(exp4) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal5 = exp5 === NO_CHANGE ? peekBinding() : exp5;
|
||||
if (bind(exp5) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal6 = exp6 === NO_CHANGE ? peekBinding() : exp6;
|
||||
if (bind(exp6) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal7 = exp7 === NO_CHANGE ? peekBinding() : exp7;
|
||||
if (bind(exp7) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ?
|
||||
pureFn(latestVal1, latestVal2, latestVal3, latestVal4, latestVal5, latestVal6, latestVal7) :
|
||||
NO_CHANGE;
|
||||
let different = bindingUpdated4(exp1, exp2, exp3, exp4);
|
||||
different = bindingUpdated2(exp5, exp6) || different;
|
||||
return bindingUpdated(exp7) || different ?
|
||||
checkAndUpdateBinding(pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7)) :
|
||||
consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn
|
||||
* @param exp1
|
||||
@ -236,62 +162,33 @@ export function pureFunction7(
|
||||
* @param exp6
|
||||
* @param exp7
|
||||
* @param exp8
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunction8(
|
||||
pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any,
|
||||
exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, exp8: any): any {
|
||||
let different = false;
|
||||
|
||||
const latestVal1 = exp1 === NO_CHANGE ? peekBinding() : exp1;
|
||||
if (bind(exp1) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal2 = exp2 === NO_CHANGE ? peekBinding() : exp2;
|
||||
if (bind(exp2) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal3 = exp3 === NO_CHANGE ? peekBinding() : exp3;
|
||||
if (bind(exp3) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal4 = exp4 === NO_CHANGE ? peekBinding() : exp4;
|
||||
if (bind(exp4) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal5 = exp5 === NO_CHANGE ? peekBinding() : exp5;
|
||||
if (bind(exp5) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal6 = exp6 === NO_CHANGE ? peekBinding() : exp6;
|
||||
if (bind(exp6) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal7 = exp7 === NO_CHANGE ? peekBinding() : exp7;
|
||||
if (bind(exp7) !== NO_CHANGE) different = true;
|
||||
|
||||
const latestVal8 = exp8 === NO_CHANGE ? peekBinding() : exp8;
|
||||
if (bind(exp8) !== NO_CHANGE) different = true;
|
||||
|
||||
return different ? pureFn(
|
||||
latestVal1, latestVal2, latestVal3, latestVal4, latestVal5, latestVal6,
|
||||
latestVal7, latestVal8) :
|
||||
NO_CHANGE;
|
||||
const different = bindingUpdated4(exp1, exp2, exp3, exp4);
|
||||
return bindingUpdated4(exp1, exp2, exp3, exp4) || different ?
|
||||
checkAndUpdateBinding(pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8)) :
|
||||
consumeBinding();
|
||||
}
|
||||
|
||||
/**
|
||||
* pureFunction instruction that can support any number of bindings.
|
||||
*
|
||||
* If the value of any provided exp has changed, calls the pure function to
|
||||
* return an updated value. Or if no values have changed, returns NO_CHANGE.
|
||||
* If the value of any provided exp has changed, calls the pure function to return
|
||||
* an updated value. Or if no values have changed, returns cached value.
|
||||
*
|
||||
* @param pureFn A pure function that takes binding values and builds an object or array
|
||||
* containing those values.
|
||||
* @param exp An array of binding values
|
||||
* @returns Updated value or NO_CHANGE
|
||||
* @returns Updated value
|
||||
*/
|
||||
export function pureFunctionV(pureFn: (v: any[]) => any, exps: any[]): any {
|
||||
export function pureFunctionV(pureFn: (...v: any[]) => any, exps: any[]): any {
|
||||
let different = false;
|
||||
|
||||
for (let i = 0; i < exps.length; i++) {
|
||||
const exp = exps[i];
|
||||
if (exp === NO_CHANGE) exps[i] = peekBinding();
|
||||
if (bind(exp) !== NO_CHANGE) different = true;
|
||||
bindingUpdated(exps[i]) && (different = true);
|
||||
}
|
||||
|
||||
return different ? pureFn(exps) : NO_CHANGE;
|
||||
return different ? checkAndUpdateBinding(pureFn.apply(null, exps)) : consumeBinding();
|
||||
}
|
||||
|
Reference in New Issue
Block a user