import { Observable } from '../Observable'; import { defer } from './defer'; import { ObservableInput } from '../types'; /** * Checks a boolean at subscription time, and chooses between one of two observable sources * * `iif` expects a function that returns a boolean (the `condition` function), and two sources, * the `trueResult` and the `falseResult`, and returns an Observable. * * At the moment of subscription, the `condition` function is called. If the result is `true`, the * subscription will be to the source passed as the `trueResult`, otherwise, the subscription will be * to the source passed as the `falseResult`. * * If you need to check more than two options to choose between more than one observable, have a look at the {@link defer} creation method. * * ## Examples * * Change at runtime which Observable will be subscribed * * ```ts * import { iif, of } from 'rxjs'; * * let subscribeToFirst; * const firstOrSecond = iif( * () => subscribeToFirst, * of('first'), * of('second') * ); * * subscribeToFirst = true; * firstOrSecond.subscribe(value => console.log(value)); * * // Logs: * // 'first' * * subscribeToFirst = false; * firstOrSecond.subscribe(value => console.log(value)); * * // Logs: * // 'second' * ``` * * Control access to an Observable * * ```ts * import { iif, of, EMPTY } from 'rxjs'; * * let accessGranted; * const observableIfYouHaveAccess = iif( * () => accessGranted, * of('It seems you have an access...'), * EMPTY * ); * * accessGranted = true; * observableIfYouHaveAccess.subscribe({ * next: value => console.log(value), * complete: () => console.log('The end') * }); * * // Logs: * // 'It seems you have an access...' * // 'The end' * * accessGranted = false; * observableIfYouHaveAccess.subscribe({ * next: value => console.log(value), * complete: () => console.log('The end') * }); * * // Logs: * // 'The end' * ``` * * @see {@link defer} * * @param condition Condition which Observable should be chosen. * @param trueResult An Observable that will be subscribed if condition is true. * @param falseResult An Observable that will be subscribed if condition is false. * @return An observable that proxies to `trueResult` or `falseResult`, depending on the result of the `condition` function. */ export function iif(condition: () => boolean, trueResult: ObservableInput, falseResult: ObservableInput): Observable { return defer(() => (condition() ? trueResult : falseResult)); }