class ScheduleImpl implements SealedSchedule<R, A, B>, Schedule.Update<R, S, A>, Schedule.Extract<A, S, B> {

  @Override
  public <C> Schedule<R, A, C> map(Function1<? super B, ? extends C> mapper) {
    return ScheduleImpl.of(
      initial(), 
      this::update, 
      (a, s) -> mapper.apply(extract(a, s)));
  }

  private  ScheduleImpl();

}