1import { Observable } from './Observable';
2import { Subscription } from './Subscription';
3
4/** OPERATOR INTERFACES */
5
6export interface UnaryFunction<T, R> { (source: T): R; }
7
8export interface OperatorFunction<T, R> extends UnaryFunction<Observable<T>, Observable<R>> {}
9
10export type FactoryOrValue<T> = T | (() => T);
11
12export interface MonoTypeOperatorFunction<T> extends OperatorFunction<T, T> {}
13
14export interface Timestamp<T> {
15  value: T;
16  timestamp: number;
17}
18
19export interface TimeInterval<T> {
20  value: T;
21  interval: number;
22}
23
24/** SUBSCRIPTION INTERFACES */
25
26export interface Unsubscribable {
27  unsubscribe(): void;
28}
29
30export type TeardownLogic = Unsubscribable | Function | void;
31
32export interface SubscriptionLike extends Unsubscribable {
33  unsubscribe(): void;
34  readonly closed: boolean;
35}
36
37export type SubscribableOrPromise<T> = Subscribable<T> | Subscribable<never> | PromiseLike<T> | InteropObservable<T>;
38
39/** OBSERVABLE INTERFACES */
40
41export interface Subscribable<T> {
42  subscribe(observer?: PartialObserver<T>): Unsubscribable;
43  /** @deprecated Use an observer instead of a complete callback */
44  subscribe(next: null | undefined, error: null | undefined, complete: () => void): Unsubscribable;
45  /** @deprecated Use an observer instead of an error callback */
46  subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Unsubscribable;
47  /** @deprecated Use an observer instead of a complete callback */
48  subscribe(next: (value: T) => void, error: null | undefined, complete: () => void): Unsubscribable;
49  subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Unsubscribable;
50}
51
52export type ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;
53
54/** @deprecated use {@link InteropObservable } */
55export type ObservableLike<T> = InteropObservable<T>;
56
57export type InteropObservable<T> = { [Symbol.observable]: () => Subscribable<T>; };
58
59/** OBSERVER INTERFACES */
60
61export interface NextObserver<T> {
62  closed?: boolean;
63  next: (value: T) => void;
64  error?: (err: any) => void;
65  complete?: () => void;
66}
67
68export interface ErrorObserver<T> {
69  closed?: boolean;
70  next?: (value: T) => void;
71  error: (err: any) => void;
72  complete?: () => void;
73}
74
75export interface CompletionObserver<T> {
76  closed?: boolean;
77  next?: (value: T) => void;
78  error?: (err: any) => void;
79  complete: () => void;
80}
81
82export type PartialObserver<T> = NextObserver<T> | ErrorObserver<T> | CompletionObserver<T>;
83
84export interface Observer<T> {
85  closed?: boolean;
86  next: (value: T) => void;
87  error: (err: any) => void;
88  complete: () => void;
89}
90
91/** SCHEDULER INTERFACES */
92
93export interface SchedulerLike {
94  now(): number;
95  schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
96}
97export interface SchedulerAction<T> extends Subscription {
98  schedule(state?: T, delay?: number): Subscription;
99}
100
101export type ObservedValueOf<O> = O extends ObservableInput<infer T> ? T : never;
102
103export type ObservedValuesFromArray<X> = X extends Array<ObservableInput<infer T>> ? T : never;
104