Rocky_Mountain_Vending/.pnpm-store/v10/files/22/b083933b9236ebc5d16a9a18edd93aaee0536506ac9b5d271d07260a5b6e9a6ac6ddd4e8594ed3c0c6cab97a4e7bc3660e4fe7b2927a53527eebff6e777bf3
DMleadgen 46d973904b
Initial commit: Rocky Mountain Vending website
Next.js website for Rocky Mountain Vending company featuring:
- Product catalog with Stripe integration
- Service areas and parts pages
- Admin dashboard with Clerk authentication
- SEO optimized pages with JSON-LD structured data

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 16:22:15 -07:00

91 lines
3.4 KiB
Text

import { Observable } from '../Observable';
import { EmptyError } from '../util/EmptyError';
import { OperatorFunction, TruthyTypesOf } from '../types';
import { filter } from './filter';
import { takeLast } from './takeLast';
import { throwIfEmpty } from './throwIfEmpty';
import { defaultIfEmpty } from './defaultIfEmpty';
import { identity } from '../util/identity';
export function last<T>(predicate: BooleanConstructor): OperatorFunction<T, TruthyTypesOf<T>>;
export function last<T, D>(predicate: BooleanConstructor, defaultValue: D): OperatorFunction<T, TruthyTypesOf<T> | D>;
export function last<T, D = T>(predicate?: null, defaultValue?: D): OperatorFunction<T, T | D>;
export function last<T, S extends T>(
predicate: (value: T, index: number, source: Observable<T>) => value is S,
defaultValue?: S
): OperatorFunction<T, S>;
export function last<T, D = T>(
predicate: (value: T, index: number, source: Observable<T>) => boolean,
defaultValue?: D
): OperatorFunction<T, T | D>;
/**
* Returns an Observable that emits only the last item emitted by the source Observable.
* It optionally takes a predicate function as a parameter, in which case, rather than emitting
* the last item from the source Observable, the resulting Observable will emit the last item
* from the source Observable that satisfies the predicate.
*
* ![](last.png)
*
* It will emit an error notification if the source completes without notification or one that matches
* the predicate. It returns the last value or if a predicate is provided last value that matches the
* predicate. It returns the given default value if no notification is emitted or matches the predicate.
*
* ## Examples
*
* Last alphabet from the sequence
*
* ```ts
* import { from, last } from 'rxjs';
*
* const source = from(['x', 'y', 'z']);
* const result = source.pipe(last());
*
* result.subscribe(value => console.log(`Last alphabet: ${ value }`));
*
* // Outputs
* // Last alphabet: z
* ```
*
* Default value when the value in the predicate is not matched
*
* ```ts
* import { from, last } from 'rxjs';
*
* const source = from(['x', 'y', 'z']);
* const result = source.pipe(last(char => char === 'a', 'not found'));
*
* result.subscribe(value => console.log(`'a' is ${ value }.`));
*
* // Outputs
* // 'a' is not found.
* ```
*
* @see {@link skip}
* @see {@link skipUntil}
* @see {@link skipLast}
* @see {@link skipWhile}
* @see {@link first}
*
* @throws {EmptyError} Delivers an `EmptyError` to the Observer's `error`
* callback if the Observable completes before any `next` notification was sent.
*
* @param predicate The condition any source emitted item has to satisfy.
* @param defaultValue An optional default value to provide if last `predicate`
* isn't met or no values were emitted.
* @return A function that returns an Observable that emits only the last item
* satisfying the given condition from the source, or an error notification
* with an `EmptyError` object if no such items are emitted.
*/
export function last<T, D>(
predicate?: ((value: T, index: number, source: Observable<T>) => boolean) | null,
defaultValue?: D
): OperatorFunction<T, T | D> {
const hasDefaultValue = arguments.length >= 2;
return (source: Observable<T>) =>
source.pipe(
predicate ? filter((v, i) => predicate(v, i, source)) : identity,
takeLast(1),
hasDefaultValue ? defaultIfEmpty(defaultValue!) : throwIfEmpty(() => new EmptyError())
);
}