Skip to content

Instantly share code, notes, and snippets.

View ryangoree's full-sized avatar
🌎

Ryan Goree ryangoree

🌎
View GitHub Profile
@ryangoree
ryangoree / useIntersecting.ts
Last active September 12, 2024 18:20
A hook to observe the intersection of elements and return the IDs of those that are intersecting.
import { useEffect, useState } from "react";
/**
* A hook to observe the intersection of elements and return the IDs of those
* that are intersecting.
* @param ids The IDs of the elements to observe
* @param options The options to pass to the IntersectionObserver
*
* @example
* ```tsx
@ryangoree
ryangoree / MergeKeys.ts
Last active June 4, 2024 18:19
Merge the keys of a union or intersection of objects into a single type.
/**
* Merge the keys of a union or intersection of objects into a single type.
*
* @example
* ```ts
* type GetBlockOptions = {
* includeTransactions?: boolean | undefined
* } & (
* | {
* blockHash?: string | undefined;
@ryangoree
ryangoree / UnionToIntersection.ts
Created June 4, 2024 18:14
Convert members of a union to an intersection.
/**
* Convert members of a union to an intersection.
*
* @example
* ```ts
* type Union = { a: number } | { b: string };
* type Intersection = UnionToIntersection<Union>;
* // { a: number } & { b: string }
* ```
*
@ryangoree
ryangoree / WordMap.ts
Last active April 29, 2024 22:53
A utility type that converts a string of words into a map of values.
/**
* A utility type that returns a union of space-separated words in a string.
*
* @example
* ```ts
* type Foo = Words<'foo bar baz'>;
* // => 'foo' | 'bar' | 'baz'
*/
type Words<TString extends string> =
TString extends `${infer Word} ${infer Rest}` ? Word | Words<Rest> : TString;
@ryangoree
ryangoree / ByIndex.ts
Created February 3, 2024 02:52
ByIndex
/**
* Converts array or tuple `T` to an object with keys as indices and values as element types.
* It's handy for when you need type-safe access based on indices, especially with tuples.
*
* `ByIndex` is useful over `{ [K in keyof T]: T[K] }` for:
* - Keeping index keys as strings for object mapping from tuples.
* - Handling arrays as tuples for a unified index-based object structure.
*
* Example:
* type ExampleTuple = ByIndex<[string, number]>; // { "0": string, "1": number }
@ryangoree
ryangoree / README.md
Last active November 7, 2024 21:31
Attempts to get the path to the file that called the function that called this function.

Get Caller Path

Attempts to get the path to the file that called the function that called this function.

📦 Install

npm i gist:b82256d70c5d9bed769b94a8d72bb38a
@ryangoree
ryangoree / camelCase.ts
Created November 5, 2023 19:37
Generic hyphen-case to CamelCase util and type
/**
* Converts a hyphenated string to camel case.
*
* @example
* camelCase('foo-bar') // 'fooBar'
*/
export function camelCase<S>(str: S): CamelCase<S> {
return (
typeof str === 'string'
? str.toLowerCase().replace(/-+([^-])/g, (_, c) => c.toUpperCase())
@ryangoree
ryangoree / getOSConfigDir.ts
Last active December 8, 2023 21:24
Get the path to an app specific config directory based on operating system standards
import os from "node:os";
import path from "node:path";
/**
* Get the path to an app specific config directory based on operating system
* standards.
* @param projectName
* @returns
*/
export function getOSConfigDir(projectName: string): string {
@ryangoree
ryangoree / binarySearch.ts
Created September 14, 2023 22:04
Conducts a binary search on a sorted array of items to find the index of a specific target.
/**
* Conducts a binary search on a sorted array of items to find the index of a
* specific target. If the target is not found, it returns the nearest index
* based on the comparator function.
*
* @param items - The sorted array of items to search within.
* @param compare - A comparator function that returns:
* - a negative number if `item` is less than the target,
* - a positive number if `item` is greater than the target,
* - and 0 if `item` is equal to the target.
@ryangoree
ryangoree / DefinedWhen.ts
Last active September 14, 2023 21:55
Experiment for dynamic interfaces
/**
* Construct a type based off T where TDefinedField is defined when
* T matches TDefinedState.
*/
type DefinedWhen<
T extends Record<string, any>,
TDefinedField extends keyof T,
TDefinedState extends Partial<T>,
> =
| (Omit<T, TDefinedField | keyof TDefinedState> &