package com.ullink.rxscheduler.cron; import rx.Observable.OnSubscribeFunc; import rx.Observer; import rx.Subscription; import rx.subscriptions.Subscriptions; import rx.util.functions.Action0; import com.ullink.rxscheduler.cron.calendar.Calendar; import com.ullink.rxscheduler.cron.calendar.CronExpression; public class OperationCron { /** * Creates an event each time interval. */ public static OnSubscribeFunc<Long> cron(final CronExpression cronExpression, final Calendar calendar, final RxCronScheduler scheduler) { // wrapped in order to work with multiple subscribers return new OnSubscribeFunc<Long>() { @Override public Subscription onSubscribe(Observer<? super Long> observer) { return new Fire(cronExpression, calendar, scheduler).onSubscribe(observer); } }; } private static class Fire implements OnSubscribeFunc<Long> { private final CronExpression cronExpression; private final Calendar calendar; private final RxCronScheduler scheduler; private long currentValue; private Fire(CronExpression cronExpression, Calendar calendar, RxCronScheduler scheduler) { this.cronExpression = cronExpression; this.calendar = calendar; this.scheduler = scheduler; } @Override public Subscription onSubscribe(final Observer<? super Long> observer) { final Subscription wrapped = scheduler.schedule(new Action0() { @Override public void call() { observer.onNext(currentValue); currentValue++; } }, cronExpression, calendar); return Subscriptions.create(new Action0() { @Override public void call() { wrapped.unsubscribe(); } }); } } }