import { Observable } from '../Observable'; 
 | 
import { Subscriber } from '../Subscriber'; 
 | 
import { OperatorFunction } from '../types'; 
 | 
import { isFunction } from './isFunction'; 
 | 
  
 | 
/** 
 | 
 * Used to determine if an object is an Observable with a lift function. 
 | 
 */ 
 | 
export function hasLift(source: any): source is { lift: InstanceType<typeof Observable>['lift'] } { 
 | 
  return isFunction(source?.lift); 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way. 
 | 
 * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription. 
 | 
 */ 
 | 
export function operate<T, R>( 
 | 
  init: (liftedSource: Observable<T>, subscriber: Subscriber<R>) => (() => void) | void 
 | 
): OperatorFunction<T, R> { 
 | 
  return (source: Observable<T>) => { 
 | 
    if (hasLift(source)) { 
 | 
      return source.lift(function (this: Subscriber<R>, liftedSource: Observable<T>) { 
 | 
        try { 
 | 
          return init(liftedSource, this); 
 | 
        } catch (err) { 
 | 
          this.error(err); 
 | 
        } 
 | 
      }); 
 | 
    } 
 | 
    throw new TypeError('Unable to lift unknown Observable type'); 
 | 
  }; 
 | 
} 
 |