import { PipeBody, PipeFunction } from "../../pipables"; import type { LinqWrapper } from "../linqWrapper"; import { IndexedSequenceElementSelector } from "./typing"; export function toArray(): PipeBody, T[]> { return target => { const arr: T[] = []; for (const e of target.unwrap()) arr.push(e); return arr; }; } toArray satisfies PipeFunction; export function toMap(keySelector: IndexedSequenceElementSelector): PipeBody, Map>; export function toMap( keySelector: IndexedSequenceElementSelector, valueSelector: IndexedSequenceElementSelector, ): PipeBody, Map>; export function toMap( keySelector: IndexedSequenceElementSelector, valueSelector?: IndexedSequenceElementSelector, ): PipeBody, Map> { return target => { const map = new Map(); let i = 0; if (valueSelector) { for (const e of target.unwrap()) { // We are not checking for key conflict -- natually JS is not throwing error for key conflicts like Java/Python. map.set(keySelector(e, i), valueSelector(e, i)); i++; } } else { for (const e of target.unwrap()) { map.set(keySelector(e, i), e as unknown as TValue); i++; } } return map; }; } toMap satisfies PipeFunction; export function toMultiMap(keySelector: IndexedSequenceElementSelector): PipeBody, Map>; export function toMultiMap( keySelector: IndexedSequenceElementSelector, valueSelector: IndexedSequenceElementSelector, ): PipeBody, Map>; export function toMultiMap( keySelector: IndexedSequenceElementSelector, valueSelector?: IndexedSequenceElementSelector, ): PipeBody, Map> { return target => { const map = new Map(); let i = 0; if (valueSelector) { for (const e of target.unwrap()) { const key = keySelector(e, i); let values = map.get(key); if (!values) { values = []; map.set(key, values); } values.push(valueSelector(e, i)); i++; } } else { for (const e of target.unwrap()) { const key = keySelector(e, i); let values = map.get(key); if (!values) { values = []; map.set(key, values); } values.push(e as unknown as TValue); i++; } } return map; }; } toMultiMap satisfies PipeFunction; export function toSet(): PipeBody, Set>; export function toSet(valueSelector: IndexedSequenceElementSelector): PipeBody, Set>; export function toSet( valueSelector?: IndexedSequenceElementSelector, ): PipeBody, Set> { return target => { const set = new Set(); if (valueSelector) { let i = 0; for (const e of target.unwrap()) { set.add(valueSelector(e, i)); i++; } } else { for (const e of target.unwrap()) { set.add(e as unknown as TValue); } } return set; }; } toSet satisfies PipeFunction;