import { bench, describe } from 'vitest'; import { EXTENDED } from '../helpers/bench-options.js'; import { SIZES } from '../helpers/data-generators.js'; import { ok, err, Result, ResultPromise, ntOk, ntErr, NtResultAsync, E, pipe, } from '../helpers/imports.js'; import * as TE from 'fp-ts/TaskEither'; // --------------------------------------------------------------------------- // ResultPromise.from — success // --------------------------------------------------------------------------- describe('ResultPromise.from — success', () => { bench('native-monad', async () => { await ResultPromise.from(() => Promise.resolve(42)); }, EXTENDED); bench('neverthrow', async () => { await NtResultAsync.fromPromise(Promise.resolve(42), () => 'err'); }, EXTENDED); bench('fp-ts', async () => { await TE.tryCatch(() => Promise.resolve(42), () => 'err')(); }, EXTENDED); }); // --------------------------------------------------------------------------- // ResultPromise.from — failure // --------------------------------------------------------------------------- describe('ResultPromise.from — failure', () => { bench('native-monad', async () => { await ResultPromise.from(() => Promise.reject(new Error('fail')), () => 'err'); }, EXTENDED); bench('neverthrow', async () => { await NtResultAsync.fromPromise(Promise.reject(new Error('fail')), () => 'err'); }, EXTENDED); bench('fp-ts', async () => { await TE.tryCatch(() => Promise.reject(new Error('fail')), () => 'err')(); }, EXTENDED); }); // --------------------------------------------------------------------------- // ResultPromise.all — all Ok // --------------------------------------------------------------------------- for (const size of [10, 100] as const) { describe(`ResultPromise.all — ${size} items, all Ok`, () => { const nmPromises = () => Array.from({ length: size }, (_, i) => Promise.resolve(ok(i))); const ntPromises = () => Array.from({ length: size }, (_, i) => NtResultAsync.fromSafePromise(Promise.resolve(i))); bench('native-monad', async () => { await ResultPromise.all(nmPromises()); }, EXTENDED); bench('neverthrow', async () => { await NtResultAsync.combine(ntPromises()); }, EXTENDED); }); }