onrails
    Preparing search index...

    @onrails/result — public surface.

    Layout: • core railway — ok/err, map/flatMap, match, recover, tap, trySync, fold, pipe • collection (sync) — combine, combineTuple • async — ResultAsync, fromPromise, tryAsync • async collection — sequenceTupleAsync, parallelTupleAsync • sync ↔ async lift — fromResult, fromAsync, asyncAfter • generator sugar — tryGen, yieldResult, $ • types — Result, Ok, Err, UnexpectedError

    Decision tree: single sync value → flatMap / match single async value → ResultAsync.flatMap / asyncAfter named multi-step workflow → @onrails/result/railway generator-style sync sugar → @onrails/result/try-gen independent validations → @onrails/result/validation

    • Convenience wrapper over fromPromise with default Error normalization. Call without onReject to get ResultAsync<T, Error>, or pass a custom mapper for a typed error.

      Type Parameters

      • T

      Parameters

      • promise: PromiseLike<T>

      Returns ResultAsync<T, Error>

      // Default: rejection → Err(Error)
      const a = tryAsync(db.users.insert(row));

      // Custom: typed error
      const b = tryAsync(db.users.insert(row), (e): DbError => ({
      kind: "db",
      cause: e,
      }));
    • Convenience wrapper over fromPromise with default Error normalization. Call without onReject to get ResultAsync<T, Error>, or pass a custom mapper for a typed error.

      Type Parameters

      • T
      • E

      Parameters

      • promise: PromiseLike<T>
      • onReject: (error: unknown) => E

      Returns ResultAsync<T, E>

      // Default: rejection → Err(Error)
      const a = tryAsync(db.users.insert(row));

      // Custom: typed error
      const b = tryAsync(db.users.insert(row), (e): DbError => ({
      kind: "db",
      cause: e,
      }));