Problem
Users must discriminate the `Result` union manually (`if (result.error) ...`). Missing ergonomic helpers that feel like neverthrow / ts-results but aligned to our shape.
Proposal
`unemail/result`:
```ts
export const isOk: (r: Result) => r is { data: T; error: null }
export const isErr: (r: Result) => r is { data: null; error: EmailError }
export const unwrap: (r: Result) => T // throws if err
export const unwrapOr: (r: Result, fallback: T) => T
export const mapOk: <T, U>(r: Result, f: (t: T) => U) => Result
```
Acceptance
Problem
Users must discriminate the `Result` union manually (`if (result.error) ...`). Missing ergonomic helpers that feel like neverthrow / ts-results but aligned to our shape.
Proposal
`unemail/result`:
```ts
export const isOk: (r: Result) => r is { data: T; error: null }
export const isErr: (r: Result) => r is { data: null; error: EmailError }
export const unwrap: (r: Result) => T // throws if err
export const unwrapOr: (r: Result, fallback: T) => T
export const mapOk: <T, U>(r: Result, f: (t: T) => U) => Result
```
Acceptance