Source code for rx.linq.observable.whiledo

from rx.core import Observable

from rx.internal.enumerable import Enumerable
from rx.internal import extensionclassmethod


@extensionclassmethod(Observable)
def while_do(cls, condition, source):
    """Repeats source as long as condition holds emulating a while loop.

    Arguments:

      condition (types.FunctionType): The condition which determines if the
        source will be repeated.
      source (Observable): The observable sequence that will be run if the
        condition function returns True.

    Returns:
      (Observable): An observable sequence which is repeated as long as the
        condition holds.
    """

    source = Observable.from_future(source)
    return Observable.concat(Enumerable.while_do(condition, source))