{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-seminars/EUD2020/project_2/src/levenshtein.js"],"names":["forEach","array","fn","i","length","map","result","Array","val","push","reduce","accumulator","Levenshtein","str_m","str_n","previous","current","matrix","_matrix","distance","v","n_val","n_idx","m_val","m_idx","charAt","Math","min","prototype","toString","inspect","no_print","max","buff","sep","rows","getMatrix","m","o","join","row","cells","cell","slice","getSteps","steps","x","y","u","l","d","Number","MAX_VALUE","valueOf"],"mappings":"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","file":"levenshtein.js","sourcesContent":["function forEach( array, fn ) { var i, length\n    i = -1\n    length = array.length\n    while ( ++i < length )\n        fn( array[ i ], i, array )\n}\n\nfunction map( array, fn ) { var result\n    result = Array( array.length )\n    forEach( array, function ( val, i, array ) {\n        result.push( fn( val, i, array ) )\n    })\n    return result\n}\n\nfunction reduce( array, fn, accumulator ) {\n    forEach( array, function( val, i, array ) {\n        accumulator = fn( val, i, array )\n    })\n    return accumulator\n}\n\n// Levenshtein distance\nfunction Levenshtein( str_m, str_n ) { var previous, current, matrix\n    // Constructor\n    matrix = this._matrix = []\n\n    // Sanity checks\n    if ( str_m == str_n )\n        return this.distance = 0\n    else if ( str_m == '' )\n        return this.distance = str_n.length\n    else if ( str_n == '' )\n        return this.distance = str_m.length\n    else {\n        // Danger Will Robinson\n        previous = [ 0 ]\n        forEach( str_m, function( v, i ) { i++, previous[ i ] = i } )\n\n        matrix[0] = previous\n        forEach( str_n, function( n_val, n_idx ) {\n            current = [ ++n_idx ]\n            forEach( str_m, function( m_val, m_idx ) {\n                m_idx++\n                if ( str_m.charAt( m_idx - 1 ) == str_n.charAt( n_idx - 1 ) )\n                    current[ m_idx ] = previous[ m_idx - 1 ]\n                else\n                    current[ m_idx ] = Math.min(\n                      previous[ m_idx ] + 1,        // Deletion\n                      current[ m_idx - 1 ] + 1,     // Insertion\n                      previous[ m_idx - 1 ] + 1    // Subtraction\n                    )\n            })\n            previous = current\n            matrix[ matrix.length ] = previous\n        })\n\n        return this.distance = current[ current.length - 1 ]\n    }\n}\n\nLevenshtein.prototype.toString = Levenshtein.prototype.inspect = function inspect ( no_print ) { var matrix, max, buff, sep, rows\n    matrix = this.getMatrix()\n    max = reduce( matrix,function( m, o ) {\n        return Math.max( m, reduce( o, Math.max, 0 ) )\n    }, 0 )\n    buff = Array( ( max + '' ).length ).join( ' ' )\n\n    sep = []\n    while ( sep.length < (matrix[0] && matrix[0].length || 0) )\n        sep[ sep.length ] = Array( buff.length + 1 ).join( '-' )\n    sep = sep.join( '-+' ) + '-'\n\n    rows = map( matrix, function( row ) { var cells\n        cells = map( row, function( cell ) {\n            return ( buff + cell ).slice( - buff.length )\n        })\n        return cells.join( ' |' ) + ' '\n    })\n\n    return rows.join( \"\\n\" + sep + \"\\n\" )\n}\n\n// steps to get from string 1 to string 2\nLevenshtein.prototype.getSteps = function()     {\n    var steps, matrix, x, y, u, l, d, min\n    steps = []\n    matrix = this.getMatrix()\n    x = matrix.length - 1\n    y = matrix[0].length - 1\n    while(x !== 0 || y !== 0)     {\n        u = y > 0 ? matrix[x][y-1] : Number.MAX_VALUE\n        l = x > 0 ? matrix[x-1][y] : Number.MAX_VALUE\n        d = y > 0 && x > 0 ? matrix[x-1][y-1] : Number.MAX_VALUE\n        min = Math.min(u, l, d)\n        if(min === d) {\n            if(d < matrix[x][y]) {\n                steps.push(['substitute', y, x])\n            }//  else steps.push(['no-op', y, x])\n            x--\n            y--\n        } else if(min === l) {\n            steps.push(['insert', y, x])\n            x--\n        } else {\n            steps.push(['delete', y, x])\n            y--\n        }\n    }\n    return steps\n}\n\nLevenshtein.prototype.getMatrix = function () {\n    return this._matrix.slice()\n}\n\nLevenshtein.prototype.valueOf = function() {\n    return this.distance\n}\n\nexport default Levenshtein;"]}