text: 'use strict';
  
  // customized for this use-case
  const isObject = x =>
  	typeof x === 'object' &&
  	x !== null &&
  	!(x instanceof RegExp) &&
  	!(x instanceof Error) &&
  	!(x instanceof Date);
  
  module.exports = function mapObj(obj, fn, opts, seen) {
  	opts = Object.assign({
  		deep: false,
  		target: {}
  	}, opts);
  
  	seen = seen || new WeakMap();
  
  	if (seen.has(obj)) {
  		return seen.get(obj);
  	}
  
  	seen.set(obj, opts.target);
  
  	const target = opts.target;
  	delete opts.target;
  
  	for (const key of Object.keys(obj)) {
  		const val = obj[key];
  		const res = fn(key, val, obj);
  		let newVal = res[1];
  
  		if (opts.deep && isObject(newVal)) {
  			if (Array.isArray(newVal)) {
  				newVal = newVal.map(x => isObject(x) ? mapObj(x, fn, opts, seen) : x);
  			} else {
  				newVal = mapObj(newVal, fn, opts, seen);
  			}
  		}
  
  		target[res[0]] = newVal;
  	}
  
  	return target;
  };
  