All files / src/walk index.ts

93.75% Statements 30/32
75% Branches 6/8
100% Functions 2/2
93.75% Lines 30/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  15x 15x 15x 15x 15x 15x 15x 15x 15x 15x 15x 15x 15x 15x   24568x 24568x 24568x     1573x 1572x 80x       1492x     22995x 22995x           15x 15x                                   24568x 24568x 24568x     24568x 24568x        
import anyWalker from "./anyWalker";
import predWalker from "./predWalker";
import wallWalker from "./wallWalker";
import fclauseWalker from "./fclauseWalker";
import shapeWalker from "./shapeWalker";
import andWalker from "./andWalker";
import collOfWalker from "./collOfWalker";
import mapOfWalker from  './mapOfWalker';
import clauseRefWalker from './clauseRefWalker';
import delayedClauseWalker from './delayedClauseWalker';
import nfaWalker from "./nfaWalker";
 
import coerceIntoClause from '../utils/coerceIntoClause';
import isProblem from '../utils/isProblem';
 
export default 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, Object.assign( { phase: 'trailblaze' }, opts ) );
 
    if ( isProblem( intermediate ) ) {
      return intermediate;
    } else {
      // in Pass 2 we return conformed and/or instrumented results
      return walker.reconstruct( intermediate, Object.assign( { phase: 'reconstruct' }, opts ) );
    }
  } else Eif ( 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 );
  vaIr walker = walkerMap[ clause.type ];

  if ( !walker ) {
    throw 'unsupported type ' + clause.type;
  }
 
  var r = walker( clause, walk );
  return r;
}