Skip to content

Instantly share code, notes, and snippets.

View ferdaber's full-sized avatar
🥩

Ferdy Budhidharma ferdaber

🥩
View GitHub Profile
@ferdaber
ferdaber / resolve-promises.ts
Last active July 24, 2024 18:01
Resolve Promises in sequence or in parallel
/**
* Resolves a list of deferred tasks in parallel or in sequence.
*/
async function resolvePromises<const T extends readonly (() => any)[]>(
deferreds: T,
parallel?: boolean
): Promise<{ -readonly [P in keyof T]: T[P] extends () => infer R ? Awaited<R> : unknown }> {
if (parallel) {
return Promise.all(deferreds.map(deferred => deferred())) as any;
} else {
@ferdaber
ferdaber / crafting-macro.md
Last active July 23, 2024 00:53
Creating a Crafting Macro for FFXIV

Creating a Crafting Advanced Macro for FFXIV

  • For each recipe, find a rotation in https://ffxivteamcraft.com/
  • Export the rotation as a crafting macro, note the time length of the macro
  • Create the following secondary macro:

For single macro loop:

Note that 71 is the G key, 67 is the C key, and 86 is the V key

/sleep 500
/presskey2 71
@ferdaber
ferdaber / abortable-promise.ts
Created July 7, 2023 15:51
Abortable Promise
export class AbortablePromise<T> extends Promise<T> {
#aborted = false;
abort() {
this.#aborted = true;
}
then<TResult1 = T, TResult2 = never>(
onfulfilled?:
| ((value: T) => TResult1 | PromiseLike<TResult1>)
@ferdaber
ferdaber / Animated Wedge Plotting
Last active September 6, 2022 18:01
Animated Wedge Plotting
Animated Wedge Plotting
import {
createContext,
useRef,
useContext,
useCallback,
useLayoutEffect,
useEffect,
ReactNode,
createElement,
} from "react";
interface Array<T> {
readonly $first: T;
readonly $last: T;
readonly $isEmpty: boolean;
$avg(): number;
$compact(filterType: 'non-null'): NonNullable<T>[];
$compact(filterType?: 'truthy'): Exclude<NonNullable<T>, false | 0 | ''>[];
$splice(start: number, deleteCount?: number): T[];
$splice(start: number, deleteCount: number, ...items: T[]): T[];
optimization: {
splitChunks: {
chunks: 'async',
minSize: 30000,
maxSize: 0,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
import produce from 'immer'
import React, { createContext, ReactNode, useContext, useReducer, useRef } from 'react'
import { debugStore } from './debug-store'
export function createStore<TState>(initialState: TState, debugKey: string, displayName: string) {
type TProducer = {
(currentState: TState): TState | void
}
type TDispatch = {
@ferdaber
ferdaber / priority-sorting.js
Created March 6, 2019 19:39
Sorting with priority
const prioritizedVals = {
a: 0,
b: 1,
c: 2
}
function sortWithPriority(a, b) {
// if it's not a prioritized value the sort value is Infinity and falls back to default sorting
const s1 = prioritizedVals[a] || Infinity
const s2 = prioritizedVals[b] || Infinity
@ferdaber
ferdaber / route-props.tsx
Last active February 12, 2019 21:10
route-props.tsx
import { RouteComponentProps } from '@reach/router'
import {
ComponentType,
ComponentClass,
FunctionComponent,
JSXElementConstructor,
ComponentProps,
} from 'react'
// method 1