/** * Iterates through an array calling a callback for each adjacent pair. * * Processes elements in pairs where: * * - First call: left is null, right is the first element * - Subsequent calls: left and right are adjacent elements. * * This pattern is particularly useful for comparing adjacent elements in * sorting validation, where each element needs to be compared with its * predecessor to ensure correct ordering. * * @example * * ```ts * // Common use case: checking sort order * const numbers = [1, 3, 2, 4] * const errors: string[] = [] * * pairwise(numbers, (left, right) => { * if (left !== null && left > right) { * errors.push(`${left} should come after ${right}`) * } * }) * // errors = ['3 should come after 2'] * ``` * * @template T - Type of array elements. * @param nodes - Array to iterate through. * @param callback - Function called for each pair (including null for first). */ function pairwise(nodes, callback) { if (nodes.length === 0) { return } callback(null, nodes.at(0)) for (let i = 1; i < nodes.length; i++) { callback(nodes.at(i - 1), nodes.at(i)) } } export { pairwise }