code: public static <A, B, T> Parser<T> sequence(
        final Parser<A> p1, final Parser<B> p2, final BiFunction<? super A, ? super B, ? extends T> map) {
      return new Parser<T>() {
        @Override boolean apply(ParseContext ctxt) {
          boolean r1 = p1.apply(ctxt);
          if (!r1) return false;
          A o1 = p1.getReturn(ctxt);
          boolean r2 = p2.apply(ctxt);
          if (!r2) return false;
          B o2 = p2.getReturn(ctxt);
          ctxt.result = map.apply(o1, o2);
          return true;
        }
        @Override public String toString() {
          return map.toString();
        }
      };
    }
docs: A {@link Parser} that runs {@code p1} and {@code p2} sequentially
  and transforms the return values using {@code map}.