maxBy(projection, emptyErrorAlternative = THROW_IF_EMPTY, isALessThanBComparator = (e1, e2) => e1 < e2) {
        let curMaxItem = EMPTY_SYGIL;
        let curMaxScore = EMPTY_SYGIL;
        for (let item of this._iterable) {
            // Delay computing the score for the first item, so that singleton lists never touch the score function.
            if (curMaxItem === EMPTY_SYGIL) {
                curMaxItem = item;
                continue;
            }
            if (curMaxScore === EMPTY_SYGIL) {
                curMaxScore = projection(curMaxItem);
            }

            let score = projection(item);
            if (isALessThanBComparator(curMaxScore, score)) {
                curMaxItem = item;
                curMaxScore = score;
            }
        }

        return emptyFallback(curMaxItem, emptyErrorAlternative, "Can't maxBy an empty sequence.");
    }
Returns the highest-scoring item in the sequence, as determined by a scoring function.

@param {!function(T) : !number} projection Determines the score of an item.
@param {=A} emptyErrorAlternative The value to return if the sequence is empty. If not provided, an error
is thrown when the sequence is empty.
@param {(function(A, A): !boolean)=} isALessThanBComparator The operation used to compare scores.
@returns {T|A}
@template T, A