/** * * Stream over the values of an enum * <pre> * {@code * ReactiveSeq.enums(Days.class,Days.Wednesday) .printOut(); * } * * Wednesday * Thursday * Friday * Saturday * Sunday * </pre> * @param c Enum to process * @param start Start value * @param <E> Enum type * @return Stream over enum */ static <E extends Enum<E>> ReactiveSeq<E> enums(Class<E> c,E start){ E[] values = c.getEnumConstants(); return Enumeration.enums( values).stream(start); } /**
/** * * Stream over the values of an enum * <pre> * {@code * ReactiveSeq.enums(Days.class,Days.Monday,Days.Wednesday,Days.Friday) .printOut(); * } * Monday * Wednesday * Friday * </pre> * @param c Enum to process * @param start Start value * @param step Values for which the Distance from start in terms of the enum ordinal determines the stepping function * @param end End value * @param <E> Enum type * @return Stream over enum */ static <E extends Enum<E>> ReactiveSeq<E> enums(Class<E> c,E start,E step,E end){ E[] values = c.getEnumConstants(); return Enumeration.enums( values).streamThenTo(start,step,end); } public static <T> Higher<reactiveSeq, T> widen(ReactiveSeq<T> narrow) {
default E succOrElse(E e,E value){ return toEnumOrElse(fromEnum(e)+1,value); } default E predOrElse(E e, E value){
default E succOrElseGet(E e,Supplier<? extends E> value){ return toEnumOrElseGet(fromEnum(e)+1,value); } default E predOrElseGet(E e, Supplier<? extends E> value){
@Test public void plusAll() throws Exception { Tuple2<Range<Days>,Option<Range<Days>>> toSunday = days.plusAll(Range.range(Saturday, Sunday,enums(Days.class))); Range<Days> rday = toSunday._1(); System.out.println(rday); assertThat(rday.start,equalTo(Days.Tuesday)); assertThat(rday.end,equalTo(Days.Sunday)); }
/** * * Stream over the values of an enum * <pre> * {@code * ReactiveSeq.enums(Days.class,Days.Wednesday,Days.Friday) .printOut(); * } * * Wednesday * Thursday * Friday * </pre> * @param c Enum to process * @param start Start value * @param end End value * @param <E> Enum type * @return Stream over enum */ static <E extends Enum<E>> ReactiveSeq<E> enumsFromTo(Class<E> c,E start,E end){ E[] values = c.getEnumConstants(); return Enumeration.enums( values).streamTo(start,end); } /**
default Seq<E> seq(E e){ return stream(e) .to().seq(); } default LazySeq<E> lazySeq(E e){
public LazySeq<T> lazySeq(){ int order = comp.compare(start,end); if(order==0){ return LazySeq.of(start); }if(order<0){ return LazySeq.cons(start,()->range(enm.succ(start).orElse(null),end,enm,comp).lazySeq()); } return LazySeq.cons(start,()->range(enm.pred(start).orElse(null),end,enm,comp).lazySeq()); }
@Test public void succOrElse(){ assertThat(Enumeration.enums(Days.values()).succOrElse(Days.Sunday, Days.Monday),equalTo(Days.Monday)); } @Test
@Test public void succOrElseGet(){ assertThat(Enumeration.enums(Days.values()).succOrElseGet(Days.Sunday, ()->Days.Monday),equalTo(Days.Monday)); } @Test
@Test public void predOrElseGet(){ assertThat(Enumeration.enums(Days.values()).predOrElseGet(Days.Monday, ()->Days.Sunday),equalTo(Days.Sunday)); } }
@Test public void predOrElse(){ assertThat(Enumeration.enums(Days.values()).predOrElse(Days.Monday, Days.Sunday),equalTo(Days.Sunday)); } @Test
DIET<T> add(Range<T> range); DIET<T> remove(T value);
default E toEnumOrElse(int e, E value){ return toEnum(e).orElse(value); } default E toEnumOrElseGet(int e, Supplier<? extends E> value){
default E predOrElse(E e, E value){ return toEnumOrElse(fromEnum(e)-1,value); } default E succOrElseGet(E e,Supplier<? extends E> value){
default E predOrElseGet(E e, Supplier<? extends E> value){ return toEnumOrElseGet(fromEnum(e)-1,value); }
/** * * Stream over the values of an enum * <pre> * {@code * ReactiveSeq.enums(Days.class,Days.Wednesday,Days.Friday) .printOut(); * } * * Wednesday * Thursday * Friday * </pre> * @param c Enum to process * @param start Start value * @param end End value * @param <E> Enum type * @return Stream over enum */ static <E extends Enum<E>> ReactiveSeq<E> enumsFromTo(Class<E> c,E start,E end){ E[] values = c.getEnumConstants(); return Enumeration.enums( values).streamTo(start,end); } /**