  /**
   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.
   *  The element's index is used in the logic of the predicate function.
   *  
   *  var res = source.skipWhile(function (value) { return value < 10; });
   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });
   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.
   * @param {Any} [thisArg] Object to use as this when executing callback.     
   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.   
   */
  observableProto.skipWhile = function (predicate, thisArg) {
    var source = this;
    return new AnonymousObservable(function (observer) {
      var i = 0, running = false;
      return source.subscribe(function (x) {
        if (!running) {
          try {
            running = !predicate.call(thisArg, x, i++, source);
          } catch (e) {
            observer.onError(e);
            return;
          }
        }
        running && observer.onNext(x);
      }, observer.onError.bind(observer), observer.onCompleted.bind(observer));
    });
  };
