Enums.java

  1. package no.motif;

  2. import static java.util.EnumSet.allOf;
  3. import static no.motif.Base.first;
  4. import static no.motif.Base.is;
  5. import static no.motif.Iterate.on;
  6. import no.motif.f.Fn;

  7. public final class Enums {

  8.     /**
  9.      * Gets the {@link Enum#name() name} of enum constants.
  10.      */
  11.     public static final Fn<Enum<?>, String> name = new Fn<Enum<?>, String>() {
  12.         @Override public String $(Enum<?> e) { return e.name(); }};


  13.     /**
  14.      * Resolve enums from constant names.
  15.      *
  16.      * @param enumType The enum type to resolve constants from.
  17.      */
  18.     public static <E extends Enum<E>> FromName<E> to(Class<E> enumType) { return new FromName<>(enumType); }


  19.     /**
  20.      * Convert from one enum to another by name.
  21.      *
  22.      * @param enumType The target enum type
  23.      */
  24.     public static <E extends Enum<E>> Fn<Enum<?>, E> toSameName(Class<E> enumType) {
  25.         return first(name).then(to(enumType));
  26.     }


  27.     /**
  28.      * {@link Fn} which resolves enum constants from names (<code>String</code>).
  29.      * Use {@link #or(Enum)} to yield a fallback value for non-existing constants,
  30.      * instead of throwing an exception.
  31.      */
  32.     public static final class FromName<E extends Enum<E>> implements Fn<String, E> {

  33.         private final Class<E> enumType;

  34.         private FromName(Class<E> enumType) {
  35.             this.enumType = enumType;
  36.         }

  37.         @Override
  38.         public E $(String name) {
  39.             return Enum.valueOf(enumType, name);
  40.         }

  41.         public final Fn<String, E> or(final E fallback) {
  42.             return new Fn<String, E>() { @Override public E $(String e) {
  43.                 return on(allOf(enumType)).map(name).filter(is(e)).map(to(enumType)).head().orElse(fallback);
  44.             }};
  45.         }
  46.     }



  47.     private Enums() {}

  48. }