package com.ullink.rxscheduler.cron;
import rx.Scheduler;
import rx.Subscription;
import rx.util.functions.Action0;
import rx.util.functions.Func2;
import com.ullink.rxscheduler.cron.calendar.Calendar;
import com.ullink.rxscheduler.cron.calendar.CronExpression;
public interface RxCronScheduler
{
/**
* Schedules an action without any parameters using cron expression. Check {@link CronExpression} for the format.
* @param action
* @param cronExpression
* @return a subscription, use the unsubscribe to cancel scheduled executions.
*/
Subscription schedule(final Action0 action, final CronExpression cronExpression);
/**
* In addition if scheduling an action using a cron expression, as {@link RxCronScheduler#schedule(Action0, CronExpression)} it also
* takes a {@link Calendar} parameter. This calendar, depending on an underlying implementation may be used to exclude holidays, some days
* of wee and so on. Check com.ullink.rxscheduler.cron.calendar for details.
* @param action
* @param cronExpression
* @param calendar
* @return
*/
Subscription schedule(final Action0 action, final CronExpression cronExpression, final Calendar calendar);
/**
* Same as {@link RxCronScheduler#schedule(Action0, CronExpression)} but takes an rx-java {@link Func2} parameter.
* @param state
* @param action
* @param cronExpression
* @return
*/
<T> Subscription schedule(T state, final Func2<? super Scheduler, ? super T, ? extends Subscription> action, final CronExpression cronExpression);
/**
* Same as {@link RxCronScheduler#schedule(Action0, CronExpression, Calendar)} but takes an rx-java {@link Func2} parameter.
* @param state
* @param action
* @param cronExpression
* @param calendar
* @return
*/
<T> Subscription schedule(T state, final Func2<? super Scheduler, ? super T, ? extends Subscription> action, final CronExpression cronExpression, final Calendar calendar);
}