code: function reconstruct(str2, trace) {
  	const isStr = typeof str2 === 'string'
  
  	const prepend = (isString => {
  		if (isString) {
  			return (preString, postString) => preString + postString
  		} else {
  			return (_, postArray, preArray = _) => {
  				Array.prototype.push.apply(preArray, postArray)
  				return preArray
  			}
  		}
  	})(isStr)
  
  	let pointer = str2.length,
  		c = isStr ? '' : []
  	for (let i = 0, n = trace.length; i < n; i++) {
  		const op = trace[i],
  			op0 = op[0],
  			op1 = op.slice(1),
  			skipBlock = parseInt(op)
  		if (skipBlock) {
  			const skipChars = str2.slice(pointer - skipBlock, pointer)
  			c = prepend(skipChars, c)
  			pointer -= skipBlock
  		} else if (op0 === 's') {
  			c = prepend(op1, c, [op1])
  			pointer--
  		} else if (op0 === 'i') {
  			c = prepend(op1, c, [op1])
  		} else {
  			pointer -= parseInt(op1) || 1
  		}
  	}
  	return c
  }
docs: Returns the (string or array) str1 from diff
  @param {(string|string[])} str2 - str2 from diff
  @param {string[]} trace - backtrace output from diffObj
  @returns {(string|string[])}