Skip to content

Commit a1b1da8

Browse files
authored
Merge pull request keithamus#4 from ReactiveHTML/main
fix .filter(), add types
2 parents 8dab7fb + 7f68ba3 commit a1b1da8

File tree

4 files changed

+108
-1
lines changed

4 files changed

+108
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
node_modules
2+
*.min.js

index-fn.d.ts

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,105 @@
1+
export interface Subscriber<T = any> {
2+
next(value: T): void;
3+
error(error: any): void;
4+
complete(): void;
5+
addTeardown(teardown: () => void): void;
6+
readonly active: boolean;
7+
readonly signal: AbortSignal;
8+
};
9+
10+
export type SubscribeCallback<T = any> = (subscriber: Subscriber<T>) => void;
11+
export type ObservableSubscriptionCallback<T = any> = (value: T) => void;
12+
13+
export interface SubscriptionObserver<T = any> {
14+
next?: ObservableSubscriptionCallback<T>;
15+
error?: ObservableSubscriptionCallback;
16+
complete?: () => void;
17+
};
18+
19+
export type ObservableInspectorAbortHandler = (value: any) => void;
20+
21+
export interface ObservableInspector<T = any> {
22+
next?: ObservableSubscriptionCallback<T>;
23+
error?: ObservableSubscriptionCallback;
24+
complete?: () => void;
25+
subscribe?: () => void;
26+
abort?: ObservableInspectorAbortHandler;
27+
};
28+
29+
export type ObserverUnion<T = any> = ObservableSubscriptionCallback<T> | SubscriptionObserver<T>;
30+
export type ObservableInspectorUnion<T = any> = ObservableSubscriptionCallback<T> | ObservableInspector<T>;
31+
32+
export interface SubscribeOptions {
33+
signal?: AbortSignal;
34+
};
35+
36+
export type Predicate<T = any> = (value: T, index: bigint) => boolean;
37+
export type Reducer<T = any, R = any> = (accumulator: R, currentValue: T, index: bigint) => R;
38+
export type Mapper<T = any, R = any> = (value: T, index: bigint) => R;
39+
export type Visitor<T = any> = (value: T, index: bigint) => void;
40+
export type CatchCallback<R = any> = (value: any) => Observable<R> | R;
41+
42+
export class Observable<T = any> {
43+
constructor(callback: SubscribeCallback<T>);
44+
subscribe(observer?: ObserverUnion<T>, options?: SubscribeOptions): void;
45+
static from(value: any): Observable<any>;
46+
takeUntil(value: any): Observable<T>;
47+
map<R>(mapper: Mapper<T, R>): Observable<R>;
48+
filter(predicate: Predicate<T>): Observable<T>;
49+
take(amount: bigint): Observable<T>;
50+
drop(amount: bigint): Observable<T>;
51+
flatMap<R>(mapper: Mapper<T, R>): Observable<R>;
52+
switchMap<R>(mapper: Mapper<T, R>): Observable<R>;
53+
inspect(inspectorUnion?: ObservableInspectorUnion<T>): Observable<T>;
54+
catch(callback: CatchCallback): Observable<T>;
55+
finally(callback: () => void): Observable<T>;
56+
toArray(options?: SubscribeOptions): Promise<T[]>;
57+
forEach(callback: Visitor<T>, options?: SubscribeOptions): Promise<void>;
58+
every(predicate: Predicate<T>, options?: SubscribeOptions): Promise<boolean>;
59+
first(options?: SubscribeOptions): Promise<T>;
60+
last(options?: SubscribeOptions): Promise<T>;
61+
find(predicate: Predicate<T>, options?: SubscribeOptions): Promise<T | undefined>;
62+
some(predicate: Predicate<T>, options?: SubscribeOptions): Promise<boolean>;
63+
reduce<R>(reducer: Reducer<T, R>, initialValue?: R, options?: SubscribeOptions): Promise<R>;
64+
};
65+
66+
interface ObservableEventListenerOptions {
67+
capture?: boolean;
68+
passive?: boolean;
69+
};
70+
71+
interface EventTarget {
72+
when<T extends keyof HTMLElementEventMap>(type: T, options?: ObservableEventListenerOptions): Observable<HTMLElementEventMap[T]>;
73+
when<T extends keyof WindowEventMap>(type: T, options?: ObservableEventListenerOptions): Observable<WindowEventMap[T]>;
74+
when<T extends keyof DocumentEventMap>(type: T, options?: ObservableEventListenerOptions): Observable<DocumentEventMap[T]>;
75+
when(type: string, options?: ObservableEventListenerOptions): Observable<Event>;
76+
};
77+
78+
declare global {
79+
export interface GlobalThis {
80+
Observable: typeof Observable;
81+
}
82+
export class Observable;
83+
84+
export interface ObservableEventListenerOptions;
85+
86+
export interface EventTarget;
87+
88+
interface Document {
89+
when<T extends keyof HTMLElementEventMap>(event: T, options?: ObservableEventListenerOptions): Observable<HTMLElementEventMap[T]>;
90+
when(type: string, options?: ObservableEventListenerOptions): Observable<Event>;
91+
}
92+
interface Element {
93+
when<T extends keyof HTMLElementEventMap>(event: T, options?: ObservableEventListenerOptions): Observable<HTMLElementEventMap[T]>;
94+
when(type: string, options?: ObservableEventListenerOptions): Observable<Event>;
95+
}
96+
interface Window {
97+
when<T extends keyof HTMLElementEventMap>(event: T, options?: ObservableEventListenerOptions): Observable<HTMLElementEventMap[T]>;
98+
when(type: string, options?: ObservableEventListenerOptions): Observable<Event>;
99+
}
100+
}
101+
1102
export declare function isSupported(): boolean;
2103
export declare function isPolyfilled(): boolean;
3104
export declare function apply(): void;
105+

observable.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './index-fn.d.ts';
2+

observable.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,9 @@ const [Observable, Subscriber] = (() => {
629629
// 3. Set idx to idx + 1.
630630
idx += 1;
631631
// 4. If matches is true, then run subscriber’s next() method, given value.
632-
if (matches) subscriber.next(mappedValue);
632+
if (matches) {
633+
subscriber.next(value);
634+
}
633635
},
634636
error(value) {
635637
// Run subscriber’s error() method, given the passed in error.

0 commit comments

Comments
 (0)