text: 'use strict';
  const array = [];
  const charCodeCache = [];
  
  const leven = (left, right) => {
  	if (left === right) {
  		return 0;
  	}
  
  	const swap = left;
  
  	// Swapping the strings if `a` is longer than `b` so we know which one is the
  	// shortest & which one is the longest
  	if (left.length > right.length) {
  		left = right;
  		right = swap;
  	}
  
  	let leftLength = left.length;
  	let rightLength = right.length;
  
  	// Performing suffix trimming:
  	// We can linearly drop suffix common to both strings since they
  	// don't increase distance at all
  	// Note: `~-` is the bitwise way to perform a `- 1` operation
  	while (leftLength > 0 && (left.charCodeAt(~-leftLength) === right.charCodeAt(~-rightLength))) {
  		leftLength--;
  		rightLength--;
  	}
  
  	// Performing prefix trimming
  	// We can linearly drop prefix common to both strings since they
  	// don't increase distance at all
  	let start = 0;
  
  	while (start < leftLength && (left.charCodeAt(start) === right.charCodeAt(start))) {
  		start++;
  	}
  
  	leftLength -= start;
  	rightLength -= start;
  
  	if (leftLength === 0) {
  		return rightLength;
  	}
  
  	let bCharCode;
  	let result;
  	let temp;
  	let temp2;
  	let i = 0;
  	let j = 0;
  
  	while (i < leftLength) {
  		charCodeCache[i] = left.charCodeAt(start + i);
  		array[i] = ++i;
  	}
  
  	while (j < rightLength) {
  		bCharCode = right.charCodeAt(start + j);
  		temp = j++;
  		result = j;
  
  		for (i = 0; i < leftLength; i++) {
  			temp2 = bCharCode === charCodeCache[i] ? temp : temp + 1;
  			temp = array[i];
  			// eslint-disable-next-line no-multi-assign
  			result = array[i] = temp > result ? temp2 > result ? result + 1 : temp2 : temp2 > temp ? temp + 1 : temp2;
  		}
  	}
  
  	return result;
  };
  
  module.exports = leven;
  // TODO: Remove this for the next major release
  module.exports.default = leven;
  