# 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

    19x

    95x
    90x
    90x

    13067x

    756x

     // @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