fork(1) download
  1. import java.util.Objects;
  2. import java.util.Optional;
  3. import java.util.function.BiFunction;
  4. import java.util.function.Function;
  5. import java.util.function.Supplier;
  6.  
  7. @FunctionalInterface
  8. interface FunctionalField<FIELD extends Enum<?>> {
  9. public Object untypedField(FIELD field);
  10.  
  11. @SuppressWarnings("unchecked")
  12. public default <VALUE> VALUE field(FIELD field) {
  13. return (VALUE) untypedField(field);
  14. }
  15.  
  16. public static <FIELD extends Enum<FIELD>> Object throwOnUndefinedField(FIELD field) throws Error {
  17. throw new InternalError(field + " is undefined");
  18. }
  19. }
  20.  
  21. @FunctionalInterface
  22. interface Cell<ELEMENT> {
  23. public <VALUE> VALUE select(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil);
  24.  
  25. public static <ELEMENT, VALUE> VALUE nil(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons,
  26. Supplier<? extends VALUE> nil) {
  27. return nil.get();
  28. }
  29.  
  30. public default int size() {
  31. return select(
  32. (element, next) -> 1 + next.size(),
  33. () -> 0
  34. );
  35. }
  36.  
  37. public default Cell<ELEMENT> first(int size) {
  38. return Optional.of(size)
  39. .<Cell<ELEMENT>>map(s -> select(
  40. (element, next) -> s == 0
  41. ? nil()
  42. : cons(element, next.first(s - 1))
  43. ,
  44. Cell::nil
  45. ))
  46. .orElseThrow(IllegalArgumentException::new)
  47. ;
  48. }
  49.  
  50. public default <ELEMENT2> Cell<ELEMENT2> map(Function<? super ELEMENT, ? extends ELEMENT2> mapper) {
  51. return select(
  52. (element, next) -> Cell.cons(mapper.apply(element), next.map(mapper)),
  53. Cell::nil
  54. );
  55. }
  56.  
  57. public default <ELEMENT2> Cell<ELEMENT2> flatMap(Function<? super ELEMENT, Cell<ELEMENT2>> mapper) {
  58. return select(
  59. (element, next) -> mapper
  60. .apply(element)
  61. .select(
  62. Cell::cons,
  63. () -> next.flatMap(mapper)
  64. )
  65. ,
  66. Cell::nil
  67. );
  68. }
  69.  
  70. public interface Cons<ELEMENT> {
  71. public ELEMENT element();
  72. public Cell<ELEMENT> next();
  73.  
  74. public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
  75. return cons.apply(element(), next());
  76. }
  77.  
  78. public static <ELEMENT> Cons<ELEMENT> new_(ELEMENT element, Cell<ELEMENT> next) {
  79. return $.$Cons.new_(element, next);
  80. }
  81.  
  82. public enum $ {
  83. ;
  84.  
  85. @FunctionalInterface
  86. private interface $Cons<ELEMENT> extends Cons<ELEMENT>, FunctionalField<$Cons.Field> {
  87. public enum Field {
  88. element,
  89. next
  90. }
  91.  
  92. @Override
  93. public default ELEMENT element() {
  94. return field(Field.element);
  95. }
  96.  
  97. public default Cell<ELEMENT> next() {
  98. return field(Field.next);
  99. }
  100.  
  101. public static <ELEMENT> $Cons<ELEMENT> new_(ELEMENT element, Cell<ELEMENT> next) {
  102. return field -> {
  103. switch (field) {
  104. case element: return element;
  105. case next: return next;
  106. default: return FunctionalField.throwOnUndefinedField(field);
  107. }
  108. };
  109. }
  110. }
  111. }
  112. }
  113.  
  114. public static <ELEMENT> Cell<ELEMENT> nil() {
  115. return Cell::nil;
  116. }
  117.  
  118. public static <ELEMENT> Cell<ELEMENT> cons(ELEMENT element, Cell<ELEMENT> next) {
  119. Objects.requireNonNull(element);
  120. Objects.requireNonNull(next);
  121. return Cons.new_(element, next)::cons;
  122. }
  123.  
  124. public static void main(String... arguments) {
  125. System.out.println(nil() == nil()); // true
  126. Cell<Integer> cell =
  127. cons(1, cons(2, cons(3, nil())))
  128. ;
  129. System.out.println(cell.size() == 3); // true
  130. System.out.println(cell.first(2).size() == 2); // true
  131. }
  132. }
  133.  
  134. public interface Main {
  135. public static void main(String... arguments) {
  136. Cell.main(arguments);
  137. }
  138. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
Main.java:12: error: illegal start of type
  public default <VALUE> VALUE field(FIELD field) {
         ^
Main.java:12: error: = expected
  public default <VALUE> VALUE field(FIELD field) {
                 ^
Main.java:12: error: ';' expected
  public default <VALUE> VALUE field(FIELD field) {
                  ^
Main.java:12: error: illegal start of type
  public default <VALUE> VALUE field(FIELD field) {
                       ^
Main.java:12: error: = expected
  public default <VALUE> VALUE field(FIELD field) {
                               ^
Main.java:12: error: illegal start of type
  public default <VALUE> VALUE field(FIELD field) {
                                    ^
Main.java:12: error: = expected
  public default <VALUE> VALUE field(FIELD field) {
                                           ^
Main.java:12: error: illegal start of type
  public default <VALUE> VALUE field(FIELD field) {
                                                ^
Main.java:12: error: <identifier> expected
  public default <VALUE> VALUE field(FIELD field) {
                                                 ^
Main.java:13: error: = expected
    return (VALUE) untypedField(field);
    ^
Main.java:13: error: ';' expected
    return (VALUE) untypedField(field);
          ^
Main.java:13: error: <identifier> expected
    return (VALUE) untypedField(field);
                 ^
Main.java:13: error: ';' expected
    return (VALUE) untypedField(field);
                  ^
Main.java:13: error: illegal start of type
    return (VALUE) untypedField(field);
                               ^
Main.java:13: error: = expected
    return (VALUE) untypedField(field);
                                     ^
Main.java:16: error: class, interface, or enum expected
  public static <FIELD extends Enum<FIELD>> Object throwOnUndefinedField(FIELD field) throws Error {
                ^
Main.java:18: error: class, interface, or enum expected
  }
  ^
Main.java:30: error: illegal start of type
  public default int size() {
         ^
Main.java:30: error: = expected
  public default int size() {
                 ^
Main.java:30: error: ';' expected
  public default int size() {
                    ^
Main.java:30: error: illegal start of type
  public default int size() {
                         ^
Main.java:30: error: <identifier> expected
  public default int size() {
                          ^
Main.java:30: error: = expected
  public default int size() {
                            ^
Main.java:30: error: ';' expected
  public default int size() {
                             ^
Main.java:31: error: <identifier> expected
    return select(
                 ^
Main.java:32: error: illegal start of type
      (element, next) -> 1 + next.size(),
      ^
Main.java:32: error: ')' expected
      (element, next) -> 1 + next.size(),
       ^
Main.java:32: error: ';' expected
      (element, next) -> 1 + next.size(),
              ^
Main.java:32: error: <identifier> expected
      (element, next) -> 1 + next.size(),
                    ^
Main.java:32: error: ';' expected
      (element, next) -> 1 + next.size(),
                     ^
Main.java:32: error: illegal start of type
      (element, next) -> 1 + next.size(),
                       ^
Main.java:32: error: <identifier> expected
      (element, next) -> 1 + next.size(),
                        ^
Main.java:32: error: = expected
      (element, next) -> 1 + next.size(),
                           ^
Main.java:32: error: ';' expected
      (element, next) -> 1 + next.size(),
                            ^
Main.java:32: error: illegal start of type
      (element, next) -> 1 + next.size(),
                                 ^
Main.java:32: error: ';' expected
      (element, next) -> 1 + next.size(),
                                        ^
Main.java:37: error: class, interface, or enum expected
  public default Cell<ELEMENT> first(int size) {
         ^
Main.java:48: error: class, interface, or enum expected
  }
  ^
Main.java:50: error: class, interface, or enum expected
  public default <ELEMENT2> Cell<ELEMENT2> map(Function<? super ELEMENT, ? extends ELEMENT2> mapper) {
         ^
Main.java:55: error: class, interface, or enum expected
  }
  ^
Main.java:57: error: class, interface, or enum expected
  public default <ELEMENT2> Cell<ELEMENT2> flatMap(Function<? super ELEMENT, Cell<ELEMENT2>> mapper) {
         ^
Main.java:68: error: class, interface, or enum expected
  }
  ^
Main.java:74: error: illegal start of type
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
           ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                   ^
Main.java:74: error: ';' expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                    ^
Main.java:74: error: illegal start of type
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                         ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                 ^
Main.java:74: error: illegal start of type
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                     ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                ^
Main.java:74: error: illegal start of type
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                 ^
Main.java:74: error: <identifier> expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                  ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                         ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                      ^
Main.java:74: error: <identifier> expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                              ^
Main.java:74: error: <identifier> expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                 ^
Main.java:74: error: ';' expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                  ^
Main.java:74: error: <identifier> expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                ^
Main.java:74: error: ';' expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                 ^
Main.java:74: error: illegal start of type
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                      ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                                ^
Main.java:74: error: illegal start of type
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                                 ^
Main.java:74: error: <identifier> expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                                  ^
Main.java:74: error: = expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                                           ^
Main.java:74: error: ';' expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                                                ^
Main.java:74: error: <identifier> expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                                                     ^
Main.java:74: error: ';' expected
    public default <VALUE> VALUE cons(BiFunction<? super ELEMENT, Cell<ELEMENT>, ? extends VALUE> cons, Supplier<? extends VALUE> nil) {
                                                                                                                                      ^
Main.java:75: error: illegal start of type
      return cons.apply(element(), next());
      ^
Main.java:75: error: = expected
      return cons.apply(element(), next());
                 ^
Main.java:75: error: <identifier> expected
      return cons.apply(element(), next());
                       ^
Main.java:75: error: <identifier> expected
      return cons.apply(element(), next());
                               ^
Main.java:75: error: ';' expected
      return cons.apply(element(), next());
                                ^
Main.java:75: error: illegal start of type
      return cons.apply(element(), next());
                                 ^
Main.java:75: error: ';' expected
      return cons.apply(element(), next());
                                         ^
Main.java:78: error: class, interface, or enum expected
    public static <ELEMENT> Cons<ELEMENT> new_(ELEMENT element, Cell<ELEMENT> next) {
                  ^
Main.java:80: error: class, interface, or enum expected
    }
    ^
Main.java:93: error: illegal start of type
        public default ELEMENT element() {
               ^
Main.java:93: error: = expected
        public default ELEMENT element() {
                       ^
Main.java:93: error: ';' expected
        public default ELEMENT element() {
                              ^
Main.java:93: error: illegal start of type
        public default ELEMENT element() {
                                      ^
Main.java:93: error: <identifier> expected
        public default ELEMENT element() {
                                       ^
Main.java:93: error: = expected
        public default ELEMENT element() {
                                         ^
Main.java:93: error: ';' expected
        public default ELEMENT element() {
                                          ^
Main.java:94: error: <identifier> expected
          return field(Field.element);
                      ^
Main.java:94: error: <identifier> expected
          return field(Field.element);
                                    ^
Main.java:97: error: illegal start of type
        public default Cell<ELEMENT> next() {
               ^
Main.java:97: error: ';' expected
        public default Cell<ELEMENT> next() {
                      ^
Main.java:97: error: invalid method declaration; return type required
        public default Cell<ELEMENT> next() {
                                     ^
Main.java:102: error: illegal start of expression
          return field -> {
                        ^
Main.java:102: error: illegal start of expression
          return field -> {
                          ^
Main.java:110: error: class, interface, or enum expected
      }
      ^
Main.java:114: error: class, interface, or enum expected
  public static <ELEMENT> Cell<ELEMENT> nil() {
                ^
Main.java:116: error: class, interface, or enum expected
  }
  ^
Main.java:118: error: class, interface, or enum expected
  public static <ELEMENT> Cell<ELEMENT> cons(ELEMENT element, Cell<ELEMENT> next) {
                ^
Main.java:120: error: class, interface, or enum expected
    Objects.requireNonNull(next);
    ^
Main.java:121: error: class, interface, or enum expected
    return Cons.new_(element, next)::cons;
    ^
Main.java:122: error: class, interface, or enum expected
  }
  ^
Main.java:124: error: class, interface, or enum expected
  public static void main(String... arguments) {
                ^
Main.java:126: error: class, interface, or enum expected
    Cell<Integer> cell =
    ^
Main.java:129: error: class, interface, or enum expected
    System.out.println(cell.size() == 3);  // true
    ^
100 errors
stdout
Standard output is empty