Skip to content

Commit

Permalink
Remove the defaultImpl parameter from Closure Delegates helper meth…
Browse files Browse the repository at this point in the history
…ods.

Callers are instead encouraged to explicitly check the number of registered delegates, or use the nullish coalescing operator on the result of the helper method as in `callFirst(delegates, (d) => ...) ?? defaultValue`

RELNOTES[INC]: Remove the `defaultImpl` parameter from Closure Delegates helper methods.

PiperOrigin-RevId: 510550303
Change-Id: Ia405b30a0bab5b8bf995b05870f74ce933252d1f
  • Loading branch information
Closure Team authored and Copybara-Service committed Feb 18, 2023
1 parent 1703a95 commit ab6fa71
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 51 deletions.
30 changes: 10 additions & 20 deletions closure/goog/delegate/delegates.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,12 @@ goog.module('goog.delegate.delegates');
* Calls the first delegate, or returns undefined if none are given.
* @param {!Array<T>} delegates
* @param {function(T): R} mapper
* @param {function(): (R|undefined)=} defaultImpl
* @return {R|undefined}
* @template T, R
*/
exports.callFirst = (delegates, mapper, defaultImpl = undefined) => {
exports.callFirst = (delegates, mapper) => {
if (delegates.length === 0) {
return defaultImpl ? defaultImpl() : undefined;
return undefined;
}
return mapper(delegates[0]);
};
Expand All @@ -35,36 +34,27 @@ exports.callFirst = (delegates, mapper, defaultImpl = undefined) => {
* undefined if no such element is found.
* @param {!Array<T>} delegates
* @param {function(T): R|undefined} mapper
* @param {function(): (R|undefined)=} defaultImpl
* @return {R|undefined}
* @template T, R
*/
exports.callUntilDefinedAndNotNull =
(delegates, mapper, defaultImpl = undefined) => {
if (delegates.length === 0) {
return defaultImpl ? defaultImpl() : undefined;
}
for (const delegate of delegates) {
const result = mapper(delegate);
if (result != null) return result;
}
return undefined;
};
exports.callUntilDefinedAndNotNull = (delegates, mapper) => {
for (const delegate of delegates) {
const result = mapper(delegate);
if (result != null) return result;
}
return undefined;
};


/**
* Calls delegates until one returns a truthy result. Returns false if no such
* element is found.
* @param {!Array<T>} delegates
* @param {function(T): R} mapper
* @param {function(): (R|boolean)=} defaultImpl
* @return {boolean|R}
* @template T, R
*/
exports.callUntilTruthy = (delegates, mapper, defaultImpl = undefined) => {
if (delegates.length === 0) {
return defaultImpl ? defaultImpl() : false;
}
exports.callUntilTruthy = (delegates, mapper) => {
for (const delegate of delegates) {
const result = mapper(delegate);
if (result) return result;
Expand Down
31 changes: 0 additions & 31 deletions closure/goog/delegate/delegates_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,37 +37,6 @@ testSuite({
assertCallCounts(1, 1, 1, 0);
},

testWithDelegatesRegistered_defaultFunctionsAreNotCalled() {
const funcs = [
() => 'non-default',
];

assertEquals('non-default', delegates.callFirst(funcs, f => f(), () => {
throw new Error('Default should not have been called');
}));
assertEquals(
'non-default',
delegates.callUntilDefinedAndNotNull(funcs, f => f(), () => {
throw new Error('Default should not have been called');
}));
assertEquals(
'non-default', delegates.callUntilTruthy(funcs, f => f(), () => {
throw new Error('Default should not have been called');
}));
},

testWithNoDelegatesRegistered_defaultFunctionsAreCalled() {
const funcs = [];

assertEquals(
'default', delegates.callFirst(funcs, f => f(), () => 'default'));
assertEquals(
'default',
delegates.callUntilDefinedAndNotNull(funcs, f => f(), () => 'default'));
assertEquals(
'default', delegates.callUntilTruthy(funcs, f => f(), () => 'default'));
},

testResultNeverDefined() {
const funcs = [
recordFunction(),
Expand Down

0 comments on commit ab6fa71

Please sign in to comment.