code: public static <A, B, C, T> Parser<T> sequence(
        final Parser<A> p1, final Parser<B> p2, final Parser<C> p3,
        final Map3<? super A, ? super B, ? super C, ? 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);
          boolean r3 = p3.apply(ctxt);
          if (!r3) return false;
          C o3 = p3.getReturn(ctxt);
          ctxt.result = map.map(o1, o2, o3);
          return true;
        }
        @Override public String toString() {
          return map.toString();
        }
      };
    }
docs: A {@link Parser} that runs 3 parser objects sequentially and transforms the return values
  using {@code map}.