All files / src/walk index.js

0% Statements 0/32
0% Branches 0/8
0% Functions 0/2
0% Lines 0/32
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70                                                                                                                                           
var oAssign = require( '../utils/objectAssign' );
var nfaWalker = require( './nfaWalker' );
var anyWalker = require( './anyWalker' );
var predWalker = require( './predWalker' );
var wallWalker = require( './wallWalker' );
var fclauseWalker = require( './fclauseWalker' );
var shapeWalker = require( './shapeWalker' );
var andWalker = require( './andWalker' );
var collOfWalker = require( './collOfWalker' );
var mapOfWalker = require( './mapOfWalker' );
var clauseRefWalker = require( './clauseRefWalker' );
var delayedClauseWalker = require( './delayedClauseWalker' );
var coerceIntoClause = require( '../utils/coerceIntoClause' );
var isProblem = require( '../utils/isProblem' );
 
function walk( clause, x, opts ) {
  var { phase } = opts;
  var walker = _getWalker( clause );
  if ( !phase ) {
    // 2-pass algorithm:
 
    // in Pass 1 we just need to know if x validates to clause, and if so, how
    var intermediate = walker.trailblaze( x, oAssign( { phase: 'trailblaze' }, opts ) );
 
    if ( isProblem( intermediate ) ) {
      return intermediate;
    } else {
      // in Pass 2 we return conformed and/or instrumented results
      return walker.reconstruct( intermediate, oAssign( { phase: 'reconstruct' }, opts ) );
    }
  } else if ( walker[ phase ] ) {
    return walker[ phase ]( x, opts );
  } else {
    throw '!';
  }
}
 
const walkerMap = {
  'OR': nfaWalker,
  'CAT': nfaWalker,
  'COLL_OF': collOfWalker,
  'ANY': anyWalker,
  'Z_OR_M': nfaWalker,
  'O_OR_M': nfaWalker,
  'Z_OR_O': nfaWalker,
  'PRED': predWalker,
  'WALL': wallWalker,
  'SHAPE': shapeWalker,
  'AND': andWalker,
  'CLAUSE_REF': clauseRefWalker,
  'DELAYED': delayedClauseWalker,
  'FCLAUSE': fclauseWalker,
  'MAP_OF': mapOfWalker,
}
 
function _getWalker( expr ) {
 
  var clause = coerceIntoClause( expr );
  var walker = walkerMap[ clause.type ];
 
  if ( !walker ) {
    throw 'unsupported type ' + clause.type;
  }
 
  var r = walker( clause, walk );
  return r;
}
 
module.exports = walk;