Developer 🥑 Advocate
& Senior Fronend Developer @Scalac
const source$: Observable<number> = timer(1000);
const result$: Observable<number> = source$
.pipe(
filter(v => v % 3 === 1),
map(v => v * 7)
);
type OperatorFunction<T, R> =
(source: Observable<T>)): Observable<R>
const identity =
(source: Observable<any>) => source
const notNull = filter(v => v !== null)
const isTruthy = filter(v => !!v)
const multiply =
m => map(v => v * m)
const power =
p => map(v => Math.pow(v, p))
const myOperator =
<T,R>(source: Observable<T>) =>
source.pipe(operator1, operator2)
const oddValueTimesSeven =
(num$: Observable<number>) =>
num$.pipe(
filter(v => v % 2 === 1),
map(v => v * 7),
)
const extractData =
<T>(response$: Observable<{data: T, loading: boolean}>)
=> response$.pipe(
isTruthy,
filter(response => !response.loading),
map(v => v.data),
)
const myOperator =
(source: Observable) =>
new Observable((observer: Subscriber) => {
source.subscribe({
next(x) {/* … */ observer.next(…)},
error(err) {/* … */ observer.error(…)},
complete(x) {/* … */ observer.complete(…)},
})
})
const customMap = <T, R>(
project: (value: T) => R
) => (source: Observable<T>) =>
new Observable<R>(observer =>
source.subscribe({
next(x) { observer.next(project(x)) },
error(err) { observer.error(err) },
complete() { observer.complete() }
})
)
const customMap = <T, R>(
project: (value: T) => R
): OperatorFunction<T, R> =>
(source: Observable<T>): Observable<R> => {
return source.lift(
new CustomMapOperator<T, R>(project)
);
};
class CustomMapOperator<T, R> implements Operator<T, R> {
constructor(private project: (value: T) => R) {}
call(sub: Subscriber<R>, src: any): TeardownLogic {
return src.subscribe(
new CustomMapSubscriber(sub, this.project)
);
}
}
/* ... */
(source: Observable<T>): Observable<R> => {
return source.lift(
new CustomMapOperator<T, R>(project)
);
};
class CustomMapOperator<T, R> implements Operator<T, R> {
constructor(private project: (value: T) => R) {}
call(subscriber: Subscriber<R>, source: any): TeardownLogic {
return source.subscribe(
new CustomMapSubscriber(subscriber, this.project)
);
}
}
class CustomMapSubscriber<T, R> extends Subscriber<T> {
constructor(
destination: Subscriber<R>,
private project: (value: T) => R
) {
super(destination);
}
protected _next(value: T): void {
this.destination.next(this.project(value));
}
}