{"version":3,"file":"index.mjs","sources":["../src/middleware.js","../src/index.js"],"sourcesContent":["import { type } from '@jsmini/type';\n\nexport function functionMiddleware() {\n  return (next) => (value, other) => {\n    if (type(value) === 'function' && type(other) === 'function') {\n      return value.toString() === other.toString();\n    }\n\n    return next(value, other);\n  };\n}\n","import { type } from '@jsmini/type';\nexport { compose } from '@jsmini/functional';\nexport { functionMiddleware } from './middleware.js';\n\nfunction keys(obj) {\n  const keyList = [];\n  for (let k in obj) {\n    // eslint-disable-next-line no-prototype-builtins\n    if (obj.hasOwnProperty(k)) {\n      keyList.push(k);\n    }\n  }\n  return keyList;\n}\n\nfunction equalArray(value, other, enhancer) {\n  if (value.length !== other.length) {\n    return false;\n  }\n\n  for (let i = 0; i < value.length; i++) {\n    if (!isEqual(value[i], other[i], enhancer)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction equalObject(value, other, enhancer) {\n  const vKeys = keys(value);\n  const oKeys = keys(other);\n\n  if (vKeys.length !== oKeys.length) {\n    return false;\n  }\n\n  for (let i = 0; i < vKeys.length; i++) {\n    const v = value[vKeys[i]];\n    const o = other[vKeys[i]];\n    if (!isEqual(v, o, enhancer)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n// map 转 array\nfunction map2Array(map) {\n  const result = Array(map.size);\n\n  map.forEach(function (value, key) {\n    result.push([key, value]);\n  });\n  return result;\n}\n\nfunction set2Array(set) {\n  const result = Array(set.size);\n\n  set.forEach((value) => {\n    result.push(value);\n  });\n\n  return result;\n}\n\nexport function isEqual(value, other, enhancer) {\n  const next = () => {\n    // 全等\n    if (value === other) {\n      // 这里为了区别 +0 和 -0, 因为 1 / -0 = -Infinite, 1 / +0 = +Infinite\n      return value !== 0 || 1 / value === 1 / other;\n    }\n\n    const vType = type(value, true);\n    const oType = type(other, true);\n\n    // 类型不同\n    if (vType !== oType) {\n      return false;\n    }\n\n    // NaN\n    if (value !== value && other !== other) {\n      return true;\n    }\n\n    // new Boolean|Number|Date\n    if (vType === 'Boolean' || vType === 'Number' || vType === 'date') {\n      return +value === +other;\n    }\n\n    // new String | /123/ | new RegExp\n    if (vType === 'String' || vType === 'regexp') {\n      return String(value) === String(other);\n    }\n\n    if (vType === 'set') {\n      return (\n        value.size === other.size &&\n        isEqual(set2Array(value), set2Array(other), enhancer)\n      );\n    }\n\n    if (vType === 'map') {\n      return (\n        value.size === other.size &&\n        isEqual(map2Array(value), map2Array(other), enhancer)\n      );\n    }\n\n    if (vType === 'array') {\n      // 数组判断\n      return equalArray(value, other, enhancer);\n    }\n    if (vType === 'object') {\n      // 对象判断\n      return equalObject(value, other, enhancer);\n    }\n\n    return value === other;\n  };\n\n  if (type(enhancer) === 'function') {\n    const res = enhancer(value, other, next);\n\n    // 兼容比较函数和中间件\n    return type(res) === 'function' ? enhancer(next)(value, other) : res;\n  }\n  return next();\n}\n\nexport function isEqualJSON(value, other, replacer = false) {\n  return JSON.stringify(value, replacer) === JSON.stringify(other, replacer);\n}\n"],"names":["functionMiddleware","next","value","other","type","toString","keys","obj","keyList","k","hasOwnProperty","push","equalArray","enhancer","length","i","isEqual","equalObject","vKeys","oKeys","v","o","map2Array","map","result","Array","size","forEach","key","set2Array","set","vType","oType","String","res","isEqualJSON","replacer","arguments","undefined","JSON","stringify"],"mappings":"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"}