docs: function each(value) {
    var iterateeFn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (val, key, iterableParent) {
      return val;
    };
    // eslint-disable-line no-unused-vars
    // modifierFn = v => v,
    var _value = (0, _clone2.default)((0, _to.toObject)(value));
  
    var convertBackFn = function convertBackFn(v) {
      return v;
    };
    if ((0, _is.isArray)(value)) convertBackFn = _to.toArray;else if ((0, _is.isString)(value)) convertBackFn = _to.toString;
  
    var _iteratorNormalCompletion = true;
    var _didIteratorError = false;
    var _iteratorError = undefined;
  
    try {
      for (var _iterator = Object.entries(_value)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
        var _step$value = _slicedToArray(_step.value, 2),
            key = _step$value[0],
            val = _step$value[1];
  
        var iterateeReturnedValue = iterateeFn(val, key, _value);
        // let valueToSet = modifierFn(val, key, _value)
        if ((0, _is.isObject)(iterateeReturnedValue) && (0, _is.isLength)((0, _toKeys2.default)(iterateeReturnedValue), 1) && !!(0, _get2.default)(iterateeReturnedValue, "$remove", false)) {
          // console.log("isObject(iterateeReturnedValue)", iterateeReturnedValue)
          (0, _remove2.default)(_value, key, true);
        } else if ((0, _is.isDefined)(iterateeReturnedValue)) {
          // console.log("isDefined(iterateeReturnedValue)", isDefined(iterateeReturnedValue))
          _value[key] = iterateeReturnedValue;
        }
      }
    } catch (err) {
      _didIteratorError = true;
      _iteratorError = err;
    } finally {
      try {
        if (!_iteratorNormalCompletion && _iterator.return) {
          _iterator.return();
        }
      } finally {
        if (_didIteratorError) {
          throw _iteratorError;
        }
      }
    }
  
    return convertBackFn(_value);
  }