--- /dev/null
+import { Operator } from '../Operator';
+import { Subscriber } from '../Subscriber';
+import { Subscription } from '../Subscription';
+import { Observable } from '../Observable';
+import { MonoTypeOperatorFunction, TeardownLogic } from '../types';
+
+/**
+ * Returns an Observable that mirrors the source Observable, but will call a specified function when
+ * the source terminates on complete or error.
+ * @param {function} callback Function to be called when source terminates.
+ * @return {Observable} An Observable that mirrors the source, but will call the specified function on termination.
+ * @method finally
+ * @owner Observable
+ */
+export function finalize<T>(callback: () => void): MonoTypeOperatorFunction<T> {
+ return (source: Observable<T>) => source.lift(new FinallyOperator(callback));
+}
+
+class FinallyOperator<T> implements Operator<T, T> {
+ constructor(private callback: () => void) {
+ }
+
+ call(subscriber: Subscriber<T>, source: any): TeardownLogic {
+ return source.subscribe(new FinallySubscriber(subscriber, this.callback));
+ }
+}
+
+/**
+ * We need this JSDoc comment for affecting ESDoc.
+ * @ignore
+ * @extends {Ignored}
+ */
+class FinallySubscriber<T> extends Subscriber<T> {
+ constructor(destination: Subscriber<T>, callback: () => void) {
+ super(destination);
+ this.add(new Subscription(callback));
+ }
+}