/**
* This module provides small, allocation-free utilities for working with values of type
* `A | undefined`, where `undefined` means "no value".
*
* Why not `Option`?
* In TypeScript, `Option` is often unnecessary. If `undefined` already models absence
* in your domain, using `A | undefined` keeps types simple, avoids extra wrappers, and
* reduces overhead. The key is that `A` itself must not include `undefined`; in this
* module `undefined` is reserved to mean "no value".
*
* When to use `A | undefined`:
* - Absence can be represented by `undefined` in your domain model.
* - You do not need to distinguish between "no value" and "value is undefined".
* - You want straightforward ergonomics and zero extra allocations.
*
* When to prefer `Option`:
* - You must distinguish `None` from `Some(undefined)` (that is, `undefined` is a valid
* payload and carries meaning on its own).
* - You need a tagged representation for serialization or pattern matching across
* boundaries where `undefined` would be ambiguous.
* - You want the richer `Option` API and are comfortable with the extra wrapper.
*
* Lawfulness note:
* All helpers treat `undefined` as absence. Do not use these utilities with payloads
* where `A` can itself be `undefined`, or you will lose information. If you need to
* carry `undefined` as a valid payload, use `Option` instead.
*
* @since 4.0.0
*/
import * as Combiner from "./Combiner.ts";
import type { LazyArg } from "./Function.ts";
import * as Reducer from "./Reducer.ts";
/**
* @since 4.0.0
*/
export declare const map: {
/**
* @since 4.0.0
*/
(f: (a: A) => B): (self: A | undefined) => B | undefined;
/**
* @since 4.0.0
*/
(self: A | undefined, f: (a: A) => B): B | undefined;
};
/**
* @since 4.0.0
*/
export declare const match: {
/**
* @since 4.0.0
*/
(options: {
readonly onUndefined: LazyArg;
readonly onDefined: (a: A) => C;
}): (self: A | undefined) => B | C;
/**
* @since 4.0.0
*/
(self: A | undefined, options: {
readonly onUndefined: LazyArg;
readonly onDefined: (a: A) => C;
}): B | C;
};
/**
* @since 4.0.0
*/
export declare const getOrThrowWith: {
/**
* @since 4.0.0
*/
(onUndefined: () => unknown): (self: A | undefined) => A;
/**
* @since 4.0.0
*/
(self: A | undefined, onUndefined: () => unknown): A;
};
/**
* @since 4.0.0
*/
export declare const getOrThrow: (self: A | undefined) => A;
/**
* @since 4.0.0
*/
export declare const liftThrowable: , B>(f: (...a: A) => B) => (...a: A) => B | undefined;
/**
* Creates a `Reducer` for `UndefinedOr` that prioritizes the first non-`undefined`
* value and combines values when both operands are present.
*
* This `Reducer` is useful for scenarios where you want to:
* - Take the first available value (like a fallback chain)
* - Combine values when both are present
* - Maintain a `undefined` state only when all values are `undefined`
*
* The `initialValue` of the `Reducer` is `undefined`.
*
* **Behavior:**
* - `undefined` + `undefined` = `undefined`
* - `a` + `undefined` = `a` (first value wins)
* - `undefined` + `b` = `b` (second value wins)
* - `a` + `b` = `a + b` (values combined)
*
* @since 4.0.0
*/
export declare function makeReducer(combiner: Combiner.Combiner): Reducer.Reducer;
/**
* Creates a `Combiner` for `UndefinedOr` that only combines values when both
* operands are not `undefined`, failing fast if either is `undefined`.
*
* This `Combiner` is useful for scenarios where you need both values to be
* present to perform an operation, such as:
* - Mathematical operations that require two operands
* - Data validation that needs both fields
* - Operations that can't proceed with partial data
*
* **Behavior:**
* - `undefined` + `undefined` = `undefined`
* - `a` + `undefined` = `undefined` (fails fast)
* - `undefined` + `b` = `undefined` (fails fast)
* - `a` + `b` = `a + b` (values combined)
*
* @see {@link makeReducerFailFast} if you have a `Reducer` and want to lift it
* to `UndefinedOr` values.
*
* @since 4.0.0
*/
export declare function makeCombinerFailFast(combiner: Combiner.Combiner): Combiner.Combiner;
/**
* Creates a `Reducer` for `UndefinedOr` by wrapping an existing `Reducer` with
* fail-fast semantics for `UndefinedOr` values.
*
* This function lifts a regular `Reducer` into the `UndefinedOr` context, allowing
* you to use existing `Reducer`s with `UndefinedOr` values while maintaining the
* fail-fast behavior where any `undefined` value causes the entire reduction to fail.
*
* The initial value is `some(reducer.initialValue)`, ensuring the `Reducer`
* starts with a valid `UndefinedOr` value.
*
* **Behavior:**
* - Fails fast (returns `undefined`) if any operand is `undefined`
* - Uses the underlying reducer's combine logic when both values are present
*
* @see {@link makeCombinerFailFast} if you only have a `Combiner` and want to
* lift it to `UndefinedOr` values.
*
* @since 4.0.0
*/
export declare function makeReducerFailFast(reducer: Reducer.Reducer): Reducer.Reducer;
//# sourceMappingURL=UndefinedOr.d.ts.map