RepositoryReturn<T> models data-access outcomes where absence of data is not an error, but still meaningful.
It captures three orthogonal states:
| State | Meaning |
|---|---|
none |
No data available |
success |
One or more values were returned |
failure |
An error occurred |
This avoids overloading null, empty arrays, or exceptions.
RepositoryReturn<T> =
| RepositoryNone<T>
| RepositorySuccess<T>
| RepositoryFailure<T>Conceptually:
RepositoryReturn<T> ≈ Either<Error, Maybe<Array<T>>>repositorySuccess(value: T | T[]): RepositoryReturn<T>
repositoryFailure(error: Error): RepositoryReturn<T>
repositoryNone(): RepositoryReturn<T>RepositoryReturnUtils.success(...)
RepositoryReturnUtils.failure(...)
RepositoryReturnUtils.none(...)
RepositoryReturnUtils.create(...)create / unionResolve normalize raw values automatically.
rr.isSuccess()
rr.isFailure()
rr.isNone()Each acts as a type guard.
rr.match(
onNone,
onFailure,
onSuccess
)- Total
- Exception-safe
- Returns a new
RepositoryReturn
rr.map(fn)
rr.mapSuccess(fn)
rr.mapElements(fn)
rr.mapFirst(fn)rr.mapFailure(fn)
rr.mapNone(fn)rr.noneAsFailure(error)
rr.noneAsSuccess(values)
rr.failureAsNone()rr.asResult(() => fallback)
rr.asFirstElementResult(() => fallback)Useful when integrating with error-centric APIs.
rr.flatten()
await rr.promiseFlaten()Supports:
- Nested
RepositoryReturn - Async payloads
mapobeys functor lawsbindavailable viaRepositoryReturnUtils- Side-effect safe
- Referentially transparent
const users =
repositorySuccess(fetchUsers())
.filter(u => u.active)
.mapElements(u => u.name)
.asResult(() => new Error("No users"));- Explicit absence
- No sentinel values
- No implicit exceptions
- Safe composition
- Repository-oriented semantics