text: 'use strict';
  
  var nearlyEqual = require('../../util/number').nearlyEqual;
  
  function factory (type, config, load, typed) {
    
    /**
     * Test whether two values are equal.
     *
     * @param  {number | BigNumber | Fraction | boolean | Complex | Unit} x   First value to compare
     * @param  {number | BigNumber | Fraction | boolean | Complex} y          Second value to compare
     * @return {boolean}                                                  Returns true when the compared values are equal, else returns false
     * @private
     */
    var equalScalar = typed('equalScalar', {
  
      'boolean, boolean': function (x, y) {
        return x === y;
      },
  
      'number, number': function (x, y) {
        return x === y || nearlyEqual(x, y, config.epsilon);
      },
  
      'BigNumber, BigNumber': function (x, y) {
        return x.eq(y);
      },
  
      'Fraction, Fraction': function (x, y) {
        return x.equals(y);
      },
  
      'Complex, Complex': function (x, y) {
        return (x.re === y.re || nearlyEqual(x.re, y.re, config.epsilon)) &&
          (x.im === y.im || nearlyEqual(x.im, y.im, config.epsilon));
      },
  
      'Unit, Unit': function (x, y) {
        if (!x.equalBase(y)) {
          throw new Error('Cannot compare units with different base');
        }
        return x.value === y.value || nearlyEqual(x.value, y.value, config.epsilon);
      },
  
      'string, string': function (x, y) {
        return x === y;
      }
    });
    
    return equalScalar;
  }
  
  exports.factory = factory;
  