Utils
Trampoline
Use recursion and avoid stack overflow.
trampoline
Trampoline functions that accept both sync and async functions.
import type { TrampolineFn, TrampolineSyncFn } from '@moeru/std/trampoline'
import { trampoline } from '@moeru/std/trampoline'
const factorial = (n: number, acc: number = 1): TrampolineSyncFn<number> =>
n <= 1
? acc
: () => factorial(n - 1, n * acc)
const factorialAsync = async (n: number, acc: number = 1): Promise<TrampolineFn<number>> =>
n <= 1
? Promise.resolve(acc)
: async () => factorialAsync(n - 1, n * acc)
console.log(await trampoline(() => factorial(5))) // 120
console.log(await trampoline(async () => factorialAsync(5))) // 120
trampolineSync
trampoline
that accept only sync functions.
import type { TrampolineSyncFn } from '@moeru/std/trampoline'
import { trampolineSync } from '@moeru/std/trampoline'
const factorial = (n: number, acc: number = 1): TrampolineSyncFn<number> =>
n <= 1
? acc
: () => factorial(n - 1, n * acc)
console.log(trampolineSync(() => factorial(5))) // 120