class RxRetry(val observableProvider:()->Observable,val until: (T)->Boolean) { fun get():Observable{ return observableGetter().flatMap { if(until(it)) { Observable.just(it).concatWith(get()) }else{ Observable.just(it) } } } } //usage : RxRetry({getDataFromServer()},{it.areMoreDataAvailable()}).get()