import { Observable } from 'rxjs';
export interface NotAsked {
    readonly tag: 'NotAsked';
}
export interface InProgress<T> {
    readonly tag: 'InProgress';
    readonly value: T | undefined;
}
export interface Failure<E, T> {
    readonly tag: 'Failure';
    readonly value: T | undefined;
    error: E;
}
export interface Success<T> {
    readonly tag: 'Success';
    readonly value: T;
}
export declare const notAsked: <T, E = string>() => RemoteData<T, E>;
export declare const inProgress: <T, E = string>(value?: T | undefined) => RemoteData<T, E>;
export declare const failure: <T, E = string>(error: E, value?: T | undefined) => RemoteData<T, E>;
export declare const success: <T, E = string>(value: T) => RemoteData<T, E>;
export declare const isNotAsked: <T, E>(value: unknown) => value is NotAsked;
export declare const isInProgress: <T, E>(value: unknown) => value is InProgress<T>;
export declare const isFailure: <T, E>(value: unknown) => value is Failure<E, T>;
export declare const isSuccess: <T, E>(value: unknown) => value is Success<T>;
export declare const isRemoteData: <T, E = string>(value: unknown) => value is RemoteData<T, E>;
export declare const fold: <T, E>(onNotAsked: () => T, onInProgress: (value: T | undefined) => T, onFailure: (error: E, value: T | undefined) => T, onSuccess: (value: T) => T, rd: RemoteData<T, E>) => T;
export declare const getOrElse: <T, E>(rd: RemoteData<T, E>, defaultValue: T) => T;
export declare const map: <A, B, E>(fn: (a: A) => B, rd: RemoteData<A, E>) => RemoteData<B, E>;
export declare const mapFailure: <A, E, F>(fn: (e: E) => F, rd: RemoteData<A, E>) => RemoteData<A, F>;
export declare const chain: <A, B, E>(fn: (a: A) => RemoteData<B, E>, rd: RemoteData<A, E>) => RemoteData<B, E>;
/**
 * Emits only when source Observable is a Success
 * @returns Success<T>
 */
export declare function filterSuccess(): <T, E>(source: Observable<RemoteData<T, E>>) => Observable<Success<T>>;
/**
 * Emits only when source Observable is a Failure
 * @returns Failure<E, T>
 */
export declare function filterFailure(): <T, E>(source: Observable<RemoteData<T, E>>) => Observable<Failure<E, T>>;
export declare type RemoteData<T, E = string> = NotAsked | InProgress<T> | Failure<E, T> | Success<T>;
