All files / src/parsers/math unaryOperator.js

100% Statements 6/6
100% Branches 2/2
100% Functions 3/3
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 37 38                        19x 18x     18x 18x     3218x   168x                              
// @flow
 
import P from 'parsimmon'
import crap from '../crap'
 
import type {
  NodeType,
  ParserType,
  UnaryOperationNodeType,
  PrimitiveNodeType
} from '../../types'
 
const UnaryOperatorParser = P.lazy((): ParserType => {
  const OperatorParser = P.oneOf('+-!')
    .trim(crap)
    .node('primitive')
  const ProjectionParser = require('../projection').default
  return P.seq(OperatorParser.many(), ProjectionParser)
    .map(
      ([operators, operand]: [Array<PrimitiveNodeType>, NodeType]): NodeType =>
        operators.length > 0
          ? operators.reduce(
            (a: NodeType, b: PrimitiveNodeType): UnaryOperationNodeType => ({
              name: 'unaryOperation',
              value: {
                operator: b,
                operand: a
              }
            }),
            operand
          )
          : operand
    )
    .desc('unaryOperator')
})
 
export default UnaryOperatorParser