rotem-horovitz
    _hello_about-me_blog_snippets_projects_games
_contact-me
find me in:
privacy

Hi, I'm

Rotem Horovitz

> front-end-developer

// find my profile on Github:

const githubLink = "https://github.com/lurx";

./view-projects./contact-me

debounce

export function debounce<T extends (...args: unknown[]) => void>(
	fn: T,
	delay: number,
): (...args: Parameters<T>) => void {
	let timerId: Nullable<ReturnType<typeof setTimeout>> = null;
	return (...args: Parameters<T>) => {
		if (timerId !== null) clearTimeout(timerId);
		timerId = setTimeout(() => {
			fn(...args);
		}, delay);
	};
}

throttle

export function throttle<T extends (...args: unknown[]) => void>(
	fn: T,
	limit: number,
): (...args: Parameters<T>) => void {
	let lastCall = -Infinity;
	return (...args: Parameters<T>) => {
		const now = Date.now();
		if (now - lastCall >= limit) {
			lastCall = now;
			fn(...args);
		}
	};
}

deep-clone

export function deepClone<T>(value: T): T {
	if (value === null || typeof value !== 'object') return value;
	if (Array.isArray(value)) return value.map(deepClone) as T;
	return Object.fromEntries(
		Object.entries(value as Record<string, unknown>).map(([key, val]) => [
			key,
			deepClone(val),
		]),
	) as T;
}

flatten

export function flatten<T>(arr: (T | T[])[]): T[] {
	return arr.reduce<T[]>(
		(acc, item) =>
			acc.concat(Array.isArray(item) ? flatten(item as (T | T[])[]) : item),
		[],
	);
}

group-by

export function groupBy<T>(arr: T[], key: keyof T): Record<string, T[]> {
	return arr.reduce<Record<string, T[]>>((acc, item) => {
		const group = String(item[key]);
		if (!acc[group]) acc[group] = [];
		acc[group].push(item);
		return acc;
	}, {});
}

memoize

export function memoize<T extends (...args: unknown[]) => unknown>(fn: T): T {
	const cache = new Map<string, ReturnType<T>>();
	return ((...args: Parameters<T>): ReturnType<T> => {
		const key = JSON.stringify(args);
		if (cache.has(key)) return cache.get(key) as ReturnType<T>;
		const result = fn(...args) as ReturnType<T>;
		cache.set(key, result);
		return result;
	}) as T;
}

chunk

export function chunk<T>(arr: T[], size: number): T[][] {
	if (size <= 0) throw new RangeError('Chunk size must be greater than 0');
	const result: T[][] = [];
	for (let index = 0; index < arr.length; index += size) {
		result.push(arr.slice(index, index + size));
	}
	return result;
}