import { map } from './map.js' import type { PipedOperator } from '../types.js' /** * Type for a keyed value */ export type Keyed = [K, V] /** * Takes an unkeyed input and returns a keyed result * @param keyFn - Function to generate the key for each value */ export function keyBy( keyFn: (value: T) => K, ): PipedOperator> { return map((value: T): Keyed => [keyFn(value), value]) } /** * Removes the key from a keyed stream */ export function unkey(): PipedOperator, V> { return map(([_, value]: Keyed): V => value) } /** * Takes a keyed input and rekeys it with a new key * @param keyFn - Function to generate the new key for each value */ export function rekey( keyFn: (value: V) => K2, ): PipedOperator, Keyed> { return map(([_, value]: Keyed): Keyed => [keyFn(value), value]) }