import { clsx, type ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } export async function fetcher( input: RequestInfo, init?: RequestInit, ): Promise { const res = await fetch(input, init); if (!res.ok) { const json = await res.json(); if (json.error) { const error = new Error(json.error) as Error & { status: number; }; error.status = res.status; throw error; } else { throw new Error("An unexpected error occurred"); } } return res.json(); } export function formatDate(input: string | number | Date): string { const date = new Date(input); return date.toLocaleDateString("en-US", { month: "long", day: "numeric", year: "numeric", }); } export const arraysAreEqual = (arr1: number[], arr2: number[]): boolean => arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]); export function nullableCompatibleEqualityCheck( naiveEqualityCheck: (a: T, b: T) => boolean, a: T | null | undefined, b: T | null | undefined, ): boolean { if (a === null || a === undefined || b === null || b === undefined) { return a === b; } return naiveEqualityCheck(a, b); }