Merge pull request 'Implement toObject' (#1) from develop into main
All checks were successful
/ publish (push) Successful in 10s

Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
2026-05-07 19:35:52 +00:00
committed by Gitea
11 changed files with 32 additions and 21 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@infendro/collection", "name": "@infendro/collection",
"version": "0.0.1", "version": "0.0.2",
"scripts": { "scripts": {
"build": "tsc" "build": "tsc"
}, },

View File

@@ -78,10 +78,12 @@ import {unzip} from "./collection/unzip";
import {windowed} from "./collection/windowed"; import {windowed} from "./collection/windowed";
import {withIndex} from "./collection/withIndex"; import {withIndex} from "./collection/withIndex";
import {zip} from "./collection/zip"; import {zip} from "./collection/zip";
import {Key, Object, toObject} from "./collection/toObject";
export type Collection<T> = { export type Collection<T> = {
[Symbol.iterator](): Iterator<T> [Symbol.iterator](): Iterator<T>
toObject<K extends Key, V>(this: Collection<[K, V]>): Object<K, V | undefined>
toArray(): T[] toArray(): T[]
toSet(): Set<T> toSet(): Set<T>
toMap<K, V>(this: Collection<[K, V]>): Map<K, V> toMap<K, V>(this: Collection<[K, V]>): Map<K, V>
@@ -190,6 +192,9 @@ function wrap<T>(value: T[]): Collection<T> {
[Symbol.iterator]() { [Symbol.iterator]() {
return value[Symbol.iterator](); return value[Symbol.iterator]();
}, },
toObject<K extends Key, V>() {
return toObject(value as [K, V][]);
},
toArray() { toArray() {
return toArray(value); return toArray(value);
}, },

View File

@@ -2,15 +2,15 @@ import {error} from "../util/error";
export function maxBy<T>(value: T[], transform: (it: T) => number): T { export function maxBy<T>(value: T[], transform: (it: T) => number): T {
if (value.length === 0) error(); if (value.length === 0) error();
let max = value[0]; let maxIt = value[0];
let maxVal = transform(max); let maxVal = transform(maxIt);
for (let index = 1; index < value.length; index++) { for (let index = 1; index < value.length; index++) {
const it = value[index]; const it = value[index];
const val = transform(it); const val = transform(it);
if (val > maxVal) { if (val > maxVal) {
max = it; maxIt = it;
maxVal = val; maxVal = val;
} }
} }
return max; return maxIt;
} }

View File

@@ -1,14 +1,14 @@
export function maxByOrNull<T>(value: T[], transform: (it: T) => number): T | null { export function maxByOrNull<T>(value: T[], transform: (it: T) => number): T | null {
if (value.length === 0) return null; if (value.length === 0) return null;
let max = value[0]; let maxIt = value[0];
let maxVal = transform(max); let maxVal = transform(maxIt);
for (let index = 1; index < value.length; index++) { for (let index = 1; index < value.length; index++) {
const it = value[index]; const it = value[index];
const val = transform(it); const val = transform(it);
if (val > maxVal) { if (val > maxVal) {
max = it; maxIt = it;
maxVal = val; maxVal = val;
} }
} }
return max; return maxIt;
} }

View File

@@ -2,15 +2,15 @@ import {error} from "../util/error";
export function minBy<T>(value: T[], transform: (it: T) => number): T { export function minBy<T>(value: T[], transform: (it: T) => number): T {
if (value.length === 0) error(); if (value.length === 0) error();
let min = value[0]; let minIt = value[0];
let minVal = transform(min); let minVal = transform(minIt);
for (let index = 1; index < value.length; index++) { for (let index = 1; index < value.length; index++) {
const it = value[index]; const it = value[index];
const val = transform(it); const val = transform(it);
if (val < minVal) { if (val < minVal) {
min = it; minIt = it;
minVal = val; minVal = val;
} }
} }
return min; return minIt;
} }

View File

@@ -1,14 +1,14 @@
export function minByOrNull<T>(value: T[], transform: (it: T) => number): T | null { export function minByOrNull<T>(value: T[], transform: (it: T) => number): T | null {
if (value.length === 0) return null; if (value.length === 0) return null;
let min = value[0]; let minIt = value[0];
let minVal = transform(min); let minVal = transform(minIt);
for (let index = 1; index < value.length; index++) { for (let index = 1; index < value.length; index++) {
const it = value[index]; const it = value[index];
const val = transform(it); const val = transform(it);
if (val < minVal) { if (val < minVal) {
min = it; minIt = it;
minVal = val; minVal = val;
} }
} }
return min; return minIt;
} }

View File

@@ -1,3 +1,3 @@
export function reversed<T>(value: T[]): T[] { export function reversed<T>(value: T[]): T[] {
return [...value].reverse(); return value.toReversed();
} }

View File

@@ -1,3 +1,3 @@
export function sorted(value: number[]): number[] { export function sorted(value: number[]): number[] {
return [...value].sort((a, b) => a - b); return value.toSorted((a, b) => a - b);
} }

View File

@@ -1,3 +1,3 @@
export function sortedBy<T>(value: T[], transform: (it: T) => number): T[] { export function sortedBy<T>(value: T[], transform: (it: T) => number): T[] {
return [...value].sort((a, b) => transform(a) - transform(b)); return value.toSorted((a, b) => transform(a) - transform(b));
} }

View File

@@ -1,3 +1,3 @@
export function sortedWith<T>(value: T[], compare: (a: T, b: T) => number): T[] { export function sortedWith<T>(value: T[], compare: (a: T, b: T) => number): T[] {
return [...value].sort(compare); return value.toSorted(compare);
} }

View File

@@ -0,0 +1,6 @@
export type Key = keyof any
export type Object<K extends Key, V> = { [key in K]: V }
export function toObject<K extends Key, V>(value: [K, V][]): Object<K, V | undefined> {
return Object.fromEntries(value) as Object<K, V | undefined>;
}