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