All files / src/parsers/abstract binaryOperator.js

100% Statements 6/6
100% Branches 2/2
100% Functions 4/4
100% Lines 6/6

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36              18x         90x 85x 85x           11302x         701x                    
// @flow
 
import P from 'parsimmon'
import crap from '../crap'
 
import type { NodeType, ParserType } from '../../types'
 
const BinaryOperatorParser = (
  OperandParser: ParserType,
  OperatorParser: ParserType,
  description: string
): ParserType =>
  P.lazy((): mixed => {
    const OperatorParser_ = OperatorParser.node('primitive')
    return P.seq(
      OperandParser,
      P.seq(crap.then(OperatorParser_), crap.then(OperandParser)).many()
    )
      .map(
        (value: [NodeType, Array<NodeType>]): NodeType =>
          value[1].length > 0
            ? {
              name: 'binaryOperation',
              value: value[1].reduce(
                (a: Array<NodeType>, b: NodeType): Array<NodeType> =>
                  a.concat(b),
                [value[0]]
              )
            }
            : value[0]
      )
      .desc(description)
  })
 
export default BinaryOperatorParser