code: function BINARY_LEFT(operatorsParser, nextParser) {
    // We run into a similar problem as with the `POSTFIX` parser above where we
    // can't recurse in the direction we want, so we have to resort to parsing an
    // entire list of operator chunks and then using `.reduce` to manually nest
    // them again.
    //
    // Example:
    //
    // INPUT  :: "1+2+3"
    // PARSE  :: [1, ["+", 2], ["+", 3]]
    // REDUCE :: ["+", ["+", 1, 2], 3]
    return P.seqMap(
      nextParser,
      P.seq(operatorsParser, nextParser).many(),
      (first, rest) => {
        return rest.reduce((acc, ch) => {
          let [op, another] = ch;
          return [op, acc, another];
        }, first);
      }
    );
  }
docs: Takes a parser for all the operators at this precedence level, and a parser that parsers everything at the next precedence level, and returns a parser that parses as many binary operations as possible, associating them to the left. (e.g. 1-2-3 is (1-2)-3 not 1-(2-3))