// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
// This module is browser compatible.
/**
 * Returns all elements in the given collection, sorted stably by their result using the given selector. The selector function is called only once for each element.
 *
 * Example:
 *
 * ```ts
 * import { sortBy } from "https://deno.land/std@$STD_VERSION/collections/sort_by.ts"
 * import { assertEquals } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts";
 *
 * const people = [
 *     { name: 'Anna', age: 34 },
 *     { name: 'Kim', age: 42 },
 *     { name: 'John', age: 23 },
 * ]
 * const sortedByAge = sortBy(people, it => it.age)
 *
 * assertEquals(sortedByAge, [
 *     { name: 'John', age: 23 },
 *     { name: 'Anna', age: 34 },
 *     { name: 'Kim', age: 42 },
 * ])
 * ```
 */ export function sortBy(array, selector) {
    const len = array.length;
    const indexes = new Array(len);
    const selectors = new Array(len);
    for(let i = 0; i < len; i++){
        indexes[i] = i;
        const s = selector(array[i]);
        selectors[i] = Number.isNaN(s) ? null : s;
    }
    indexes.sort((ai, bi)=>{
        const a = selectors[ai];
        const b = selectors[bi];
        if (a === null) return 1;
        if (b === null) return -1;
        return a > b ? 1 : a < b ? -1 : 0;
    });
    for(let i1 = 0; i1 < len; i1++){
        indexes[i1] = array[indexes[i1]];
    }
    return indexes;
}
//# sourceMappingURL=data:application/json;base64,[encoded data, 4304 characters]