All files / src/utils coerceIntoClause.js

0% Statements 0/21
0% Branches 0/9
0% Functions 0/4
0% Lines 0/21
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                                                                                           
var isPred = require( './isPred' );
var isClause = require( './isClause' );
var isClauseRef = require( './isClauseRef' );
var isDelayedClause = require( './isDelayedClause' );
var Clause = require( '../models/Clause' );
var Problem = require( '../models/Problem' );
var fnName = require( './fnName' );
var stringifyWithFnName = require( './stringifyWithFnName' );
 
var CLAUSE_TYPE_PRED = 'PRED';
 
function coerceIntoClause( expr ) {
  if ( isClause( expr ) || isClauseRef( expr ) || isDelayedClause( expr ) ) {
    return expr;
  } else if ( isPred( expr ) ) {
    return _wrap( expr );
  } else {
    console.error( expr );
    throw new Error(
      `'Expression must either be a Clause object or a predication function that returns true or false. Given value: ${stringifyWithFnName( expr )}'` );
  }
}
 
function _wrap( pred ) {
  return new Clause( {
    type: CLAUSE_TYPE_PRED,
    exprs: [ pred ],
    opts: {
      predicate: pred,
    },
    conformFn: predConformer( pred ),
  } );
}
 
function predConformer( pred ) {
  return function conformPred( x ) {
    if ( pred( x ) ) {
      return x;
    } else {
      return new Problem( x, pred, [], 'Predicate ' + fnName( pred ) + ' returns false' );
    }
  }
}
 
module.exports = coerceIntoClause;