{"version":3,"sources":["jsdelivr-header.js","/npm/imh@0.0.6/src/lib/index.js"],"names":[],"mappings":"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","file":"/npm/imh@0.0.6/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/imh@0.0.6/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","let globalClonedObjects;\n\nconst defaultOrderBy = (x) => x;\n\nexport default function imh() {\n  // create mutator\n  if (arguments.length < 2) {\n    return wrapMutator(arguments[0], function (model, apply) {\n      return apply(model);\n    });\n  }\n  return imh(arguments[1])(arguments[0]);\n}\n\nObject.assign(imh, {\n  set,\n  prop,\n  map,\n  unset,\n  push,\n  merge,\n  splice,\n  filter,\n  sort,\n  orderBy,\n  swap,\n  remove,\n  add,\n  mul,\n  div,\n  toggle,\n  val,\n  clear,\n  def,\n  pop,\n  shift,\n  unshift,\n  reverse,\n  result,\n  lower,\n  upper,\n  replace,\n});\n\nfunction wrapMutator(mutations, mutator) {\n  if (!Array.isArray(mutations)) {\n    mutations = [mutations];\n  }\n  return function (model, data, context) {\n    if (!context) {\n      context = createContext(model);\n    }\n    return mutator(\n      model,\n      function (value, data, customMutations = mutations) {\n        return applyMutations(value, context, data, customMutations);\n      },\n      context,\n      data\n    );\n  };\n}\n\nexport function push(...items) {\n  return function pushMutation(model) {\n    mustBeArray(model);\n    if (!items.length) return model;\n    return model.concat(items);\n  };\n}\n\nexport function map(mutations) {\n  return wrapMutator(mutations, function (model, apply) {\n    mustBeArray(model);\n\n    let hasChange = false;\n    const nextModel = model.map(function (currentValue, index, array) {\n      const data = { index, array };\n      let nextValue = tryMutate(apply(currentValue, data), (customMutations) =>\n        apply(currentValue, data, customMutations)\n      );\n      if (nextValue !== currentValue) {\n        hasChange = true;\n        return nextValue;\n      }\n      return currentValue;\n    });\n    return hasChange ? nextModel : model;\n  });\n}\n\nexport function merge(...objects) {\n  return function (model, _, context) {\n    let cloned = model;\n    const changedKeys = new Set();\n    // use for loop for better performance\n    for (let i = 0; i < objects.length; i++) {\n      const object = objects[i];\n      const keys = Object.keys(object);\n      for (let j = 0; j < keys.length; j++) {\n        const key = keys[j];\n        const value = object[key];\n        if (cloned[key] !== value) {\n          if (cloned === model) {\n            cloned = context.clone(model);\n          }\n          cloned[key] = value;\n          changedKeys.add(key);\n        }\n      }\n    }\n\n    if (changedKeys.size) {\n      let hasChange = false;\n      changedKeys.forEach(function (key) {\n        if (model[key] !== cloned[key]) {\n          hasChange = true;\n        }\n      });\n      if (!hasChange) return model;\n    }\n    return cloned;\n  };\n}\n\nexport function prop(key, mutations) {\n  if (Array.isArray(key)) {\n    return key.reduceRight(function (prevMutations, key) {\n      return [mutateSingleProp(key, prevMutations)];\n    }, mutations)[0];\n  }\n  return mutateSingleProp(key, mutations);\n}\n\nfunction mutateSingleProp(key, mutations) {\n  return wrapMutator(\n    tryMutate(\n      mutations,\n      (x) => x,\n      (x) => val(x)\n    ),\n    function (model, apply, context) {\n      if (typeof model === \"undefined\" || model === null) {\n        model = {};\n      }\n      if (typeof key === \"function\") {\n        if (!Array.isArray(model)) {\n          throw new Error(\"Can use dynamic key with array type model only\");\n        }\n        let cloned = model;\n        for (let i = 0; i < cloned.length; i++) {\n          const currentValue = cloned[i];\n          const found = key(cloned[i], i);\n          if (found) {\n            const nextValue = apply(currentValue);\n            if (nextValue !== cloned[i]) {\n              if (cloned === model) {\n                cloned = context.clone(model);\n              }\n              cloned[i] = nextValue;\n            }\n          }\n        }\n        return cloned;\n      }\n      const currentValue = model[key];\n      const nextValue = apply(currentValue);\n      if (currentValue === nextValue) {\n        return model;\n      }\n      const cloned = context.clone(model);\n      cloned[key] = nextValue;\n      return cloned;\n    }\n  );\n}\n\nexport function set(key, value) {\n  return function (model, data, context) {\n    if (typeof model === \"undefined\" || model === null) {\n      model = {};\n    }\n    if (model[key] === value) return model;\n    const cloned = context.clone(model);\n    cloned[key] = value;\n    return cloned;\n  };\n}\n\nexport function unset() {\n  const args = arguments;\n  return function (model, data, context) {\n    let cloned = model;\n    for (let i = 0; i < args.length; i++) {\n      const key = args[i];\n      if (key in cloned) {\n        if (cloned === model) {\n          cloned = context.clone(model);\n        }\n        delete cloned[key];\n      }\n    }\n    return cloned;\n  };\n}\n\nfunction applyMutations(model, context, data, mutations) {\n  return mutations.reduce(function (value, mutation) {\n    const result = mutation(value, data, context);\n    if (typeof result === \"function\") return result(value, context);\n    return result;\n  }, model);\n}\n\nfunction createContext(root) {\n  const clonedObjects = (globalClonedObjects = new WeakMap());\n  return {\n    root,\n    clone(obj, array) {\n      if (typeof obj !== \"object\") {\n        throw new Error(\"Cannot clone non-object value\");\n      }\n      // is cloned\n      if (clonedObjects.has(obj)) return obj;\n\n      let cloned;\n      if (Array.isArray(obj)) {\n        if (array === false)\n          throw new Error(\"Expected object type but got array type\");\n        cloned = obj.slice();\n      } else {\n        if (array === true)\n          throw new Error(\"Expected array type but got object type\");\n        cloned = Object.assign({}, obj);\n      }\n      clonedObjects.set(cloned, obj);\n      return cloned;\n    },\n  };\n}\n\nexport function splice(index, length) {\n  const args = arguments;\n  return function spliceMutation(model, data, context) {\n    mustBeArray(model);\n    const hasChange = args.length > 2 || (index < model.length - 1 && length);\n    if (!hasChange) return model;\n    const cloned = context.clone(model);\n    context.result = cloned.splice.apply(cloned, args);\n    return shallowMemoArray(model, cloned);\n  };\n}\n\nexport function filter(predicate) {\n  return function filterMutation(model) {\n    mustBeArray(model);\n    const filtered = model.filter(predicate);\n    return shallowMemoArray(model, filtered);\n  };\n}\n\nexport function sort(compareFn) {\n  return function sortMutation(model, data, context) {\n    mustBeArray(model);\n    const cloned = context.clone(model);\n    cloned.sort(compareFn);\n    return shallowMemoArray(model, cloned);\n  };\n}\n\nexport function orderBy(selector = defaultOrderBy, direction = 1) {\n  return sort((a, b) => {\n    const av = selector(a);\n    const bv = selector(b);\n    return (av > bv ? 1 : av < bv ? -1 : 0) * direction;\n  });\n}\n\nexport function swap(from, to) {\n  return function swapMutation(model, data, context) {\n    mustBeArray(model);\n    const fv = model[from];\n    const tv = model[to];\n    if (fv === tv) return model;\n    const cloned = context.clone(model);\n    cloned[from] = tv;\n    cloned[to] = fv;\n    return cloned;\n  };\n}\n\nexport function remove(...indices) {\n  return function removeMutation(model, data, context) {\n    mustBeArray(model);\n    // remove invalid indices before to proceed\n    const validIndices = indices\n      .filter((index) => index >= 0 && index < model.length)\n      .sort();\n    if (!validIndices.length) return model;\n    const cloned = context.clone(model);\n    while (validIndices.length) {\n      cloned.splice(validIndices.pop(), 1);\n    }\n    return cloned;\n  };\n}\n\nexport function add(value) {\n  return function addMutation(model) {\n    if (typeof model === \"string\") {\n      return model + value;\n    }\n    // is timespan\n    if (typeof value === \"object\") {\n      const {\n        years = 0,\n        months = 0,\n        days = 0,\n        hours = 0,\n        minutes = 0,\n        seconds = 0,\n        milliseconds = 0,\n      } = value;\n      const isTimestamp = typeof model === \"number\";\n      const from = isTimestamp ? new Date() : model;\n      const to = new Date(\n        from.getFullYear() + years,\n        from.getMonth() + months,\n        from.getDate() + days,\n        from.getHours() + hours,\n        from.getMinutes() + minutes,\n        from.getSeconds() + seconds,\n        from.getMilliseconds() + milliseconds\n      );\n      if (isTimestamp) {\n        return model + to.getTime() - from.getTime();\n      } else {\n        if (from.getTime() === to.getTime()) return model;\n        return to;\n      }\n    } else if (model instanceof Date) {\n      const to = new Date(model.getTime() + parseFloat(value));\n      if (to.getTime() === model.getTime()) return model;\n      return to;\n    }\n    return model + value;\n  };\n}\n\nexport function mul(value) {\n  return function (model) {\n    return model * value;\n  };\n}\n\nexport function div(value) {\n  return function (model) {\n    return model / value;\n  };\n}\n\nexport function replace(findWhat, replaceWith) {\n  return function replaceMutation(model) {\n    mustBeString(model);\n    return model.replace(findWhat, replaceWith);\n  };\n}\n\nexport function upper() {\n  return function upperMutation(model) {\n    mustBeString(model);\n    return model.toUpperCase();\n  };\n}\n\nexport function lower() {\n  return function lowerMutation(model) {\n    mustBeString(model);\n    return model.toLowerCase();\n  };\n}\n\nexport function toggle() {\n  return function toggleMutation(model) {\n    return !model;\n  };\n}\n\nexport function val(value) {\n  return function valMutation() {\n    return value;\n  };\n}\n\nexport function def(value) {\n  return function defMutation(model = value) {\n    return model;\n  };\n}\n\nexport function clear() {\n  return function clearMutation(model) {\n    mustBeArray(model);\n    return model.length ? [] : model;\n  };\n}\n\nexport function pop() {\n  return function popMutation(model, data, context) {\n    mustBeArray(model);\n    if (!model.length) return model;\n    const cloned = context.clone(model);\n    context.result = cloned.pop();\n    return cloned;\n  };\n}\n\nexport function result(fn) {\n  return function resultMutation(model, data, context) {\n    return tryMutate(\n      fn(context.result, model),\n      (mutations) => applyMutations(model, context, data, mutations),\n      () => model\n    );\n  };\n}\n\nexport function shift() {\n  return function shiftMutation(model, data, context) {\n    mustBeArray(model);\n    if (!model.length) return model;\n    const cloned = context.clone(model);\n    context.result = cloned.shift();\n    return cloned;\n  };\n}\n\nexport function unshift(...items) {\n  return function unshiftMutation(model) {\n    mustBeArray(model);\n    if (!model.length) return items;\n    return items.concat(model);\n  };\n}\n\nexport function reverse() {\n  return function (model, data, context) {\n    mustBeArray(model);\n    if (model.length < 2) return model;\n    const cloned = context.clone(model);\n    cloned.reverse();\n    return shallowMemoArray(model, cloned);\n  };\n}\n\nfunction mustBeArray(value) {\n  if (!Array.isArray(value)) throw new Error(\"Input must be array type\");\n}\n\nfunction mustBeString(value) {\n  if (typeof value !== \"string\") throw new Error(\"Input must be string type\");\n}\n\nfunction getOriginalValue(obj) {\n  if (typeof obj === \"object\" && globalClonedObjects) {\n    const original = globalClonedObjects.get(obj);\n    return original || obj;\n  }\n  return obj;\n}\n\nfunction shallowMemo(oldValue, newValue) {\n  oldValue = getOriginalValue(oldValue);\n\n  if (typeof newValue === \"function\") newValue = newValue();\n  if (isEqual(oldValue, newValue)) return oldValue;\n  if (Array.isArray(oldValue) && Array.isArray(newValue))\n    return shallowMemoArray(oldValue, newValue);\n  return newValue;\n}\n\nfunction shallowMemoArray(oldValue, newValue) {\n  oldValue = getOriginalValue(oldValue);\n\n  if (\n    oldValue.length === newValue.length &&\n    oldValue.every((value, index) => newValue[index] === value)\n  )\n    return oldValue;\n  return newValue;\n}\n\nfunction isEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n\n  if (\n    typeof a !== \"object\" ||\n    typeof b !== \"object\" ||\n    isPromiseLike(a) ||\n    isPromiseLike(b) ||\n    Array.isArray(a) ||\n    Array.isArray(b)\n  )\n    return false;\n  if (a === null && b) return false;\n  if (b === null && a) return false;\n\n  const comparer = (key) => {\n    return a[key] === b[key];\n  };\n  return Object.keys(a).every(comparer) && Object.keys(b).every(comparer);\n}\n\nfunction isPromiseLike(obj) {\n  return obj && typeof obj.then === \"function\";\n}\n\nfunction tryMutate(value, fn, fallback) {\n  if (typeof value === \"function\") {\n    return fn([value]);\n  }\n  if (Array.isArray(value) && typeof value[0] === \"function\") {\n    return fn(value);\n  }\n  return fallback ? fallback(value) : value;\n}\n"]}