11'use strict' ; 
22
33const  { 
4-   Array, 
5-   ArrayPrototypeFill, 
64  ArrayPrototypePush, 
75  ArrayPrototypeSlice, 
6+   Int32Array, 
87  StringPrototypeEndsWith, 
98}  =  primordials ; 
109
@@ -26,7 +25,7 @@ function myersDiff(actual, expected, checkCommaDisparity = false) {
2625  const  actualLength  =  actual . length ; 
2726  const  expectedLength  =  expected . length ; 
2827  const  max  =  actualLength  +  expectedLength ; 
29-   const  v  =  ArrayPrototypeFill ( Array ( 2  *  max  +  1 ) ,   0 ) ; 
28+   const  v  =  new   Int32Array ( 2  *  max  +  1 ) ; 
3029
3130  const  trace  =  [ ] ; 
3231
@@ -35,22 +34,24 @@ function myersDiff(actual, expected, checkCommaDisparity = false) {
3534    ArrayPrototypePush ( trace ,  newTrace ) ; 
3635
3736    for  ( let  diagonalIndex  =  - diffLevel ;  diagonalIndex  <=  diffLevel ;  diagonalIndex  +=  2 )  { 
38-       let  x ; 
39-       if  ( diagonalIndex  ===  - diffLevel  || 
40-         ( diagonalIndex  !==  diffLevel  &&  v [ diagonalIndex  -  1  +  max ]  <  v [ diagonalIndex  +  1  +  max ] ) )  { 
41-         x  =  v [ diagonalIndex  +  1  +  max ] ; 
42-       }  else  { 
43-         x  =  v [ diagonalIndex  -  1  +  max ]  +  1 ; 
44-       } 
45- 
37+       const  offset  =  diagonalIndex  +  max ; 
38+       const  previousOffset  =  v [ offset  -  1 ] ; 
39+       const  nextOffset  =  v [ offset  +  1 ] ; 
40+       let  x  =  diagonalIndex  ===  - diffLevel  ||  ( diagonalIndex  !==  diffLevel  &&  previousOffset  <  nextOffset )  ?
41+         nextOffset  :
42+         previousOffset  +  1 ; 
4643      let  y  =  x  -  diagonalIndex ; 
4744
48-       while  ( x  <  actualLength  &&  y  <  expectedLength  &&  areLinesEqual ( actual [ x ] ,  expected [ y ] ,  checkCommaDisparity ) )  { 
45+       while  ( 
46+         x  <  actualLength  && 
47+         y  <  expectedLength  && 
48+         areLinesEqual ( actual [ x ] ,  expected [ y ] ,  checkCommaDisparity ) 
49+       )  { 
4950        x ++ ; 
5051        y ++ ; 
5152      } 
5253
53-       v [ diagonalIndex   +   max ]  =  x ; 
54+       v [ offset ]  =  x ; 
5455
5556      if  ( x  >=  actualLength  &&  y  >=  expectedLength )  { 
5657        return  backtrack ( trace ,  actual ,  expected ,  checkCommaDisparity ) ; 
@@ -71,10 +72,13 @@ function backtrack(trace, actual, expected, checkCommaDisparity) {
7172  for  ( let  diffLevel  =  trace . length  -  1 ;  diffLevel  >=  0 ;  diffLevel -- )  { 
7273    const  v  =  trace [ diffLevel ] ; 
7374    const  diagonalIndex  =  x  -  y ; 
74-     let   prevDiagonalIndex ; 
75+     const   offset   =   diagonalIndex   +   max ; 
7576
76-     if  ( diagonalIndex  ===  - diffLevel  || 
77-       ( diagonalIndex  !==  diffLevel  &&  v [ diagonalIndex  -  1  +  max ]  <  v [ diagonalIndex  +  1  +  max ] ) )  { 
77+     let  prevDiagonalIndex ; 
78+     if  ( 
79+       diagonalIndex  ===  - diffLevel  || 
80+       ( diagonalIndex  !==  diffLevel  &&  v [ offset  -  1 ]  <  v [ offset  +  1 ] ) 
81+     )  { 
7882      prevDiagonalIndex  =  diagonalIndex  +  1 ; 
7983    }  else  { 
8084      prevDiagonalIndex  =  diagonalIndex  -  1 ; 
@@ -84,8 +88,11 @@ function backtrack(trace, actual, expected, checkCommaDisparity) {
8488    const  prevY  =  prevX  -  prevDiagonalIndex ; 
8589
8690    while  ( x  >  prevX  &&  y  >  prevY )  { 
87-       const  value  =  ! checkCommaDisparity  || 
88-         StringPrototypeEndsWith ( actual [ x  -  1 ] ,  ',' )  ? actual [ x  -  1 ]  : expected [ y  -  1 ] ; 
91+       const  actualItem  =  actual [ x  -  1 ] ; 
92+       const  value  = 
93+         ! checkCommaDisparity  ||  StringPrototypeEndsWith ( actualItem ,  ',' )  ?
94+           actualItem  :
95+           expected [ y  -  1 ] ; 
8996      ArrayPrototypePush ( result ,  {  __proto__ : null ,  type : 'nop' ,  value } ) ; 
9097      x -- ; 
9198      y -- ; 
@@ -110,13 +117,15 @@ function printSimpleMyersDiff(diff) {
110117
111118  for  ( let  diffIdx  =  diff . length  -  1 ;  diffIdx  >=  0 ;  diffIdx -- )  { 
112119    const  {  type,  value }  =  diff [ diffIdx ] ; 
120+     let  color  =  colors . white ; 
121+ 
113122    if  ( type  ===  'insert' )  { 
114-       message   +=   ` ${ colors . green } ${ value } ${ colors . white } ` ; 
123+       color   =   colors . green ; 
115124    }  else  if  ( type  ===  'delete' )  { 
116-       message  +=  `${ colors . red } ${ value } ${ colors . white }  ` ; 
117-     }  else  { 
118-       message  +=  `${ colors . white } ${ value } ${ colors . white }  ` ; 
125+       color  =  colors . red ; 
119126    } 
127+ 
128+     message  +=  `${ color } ${ value } ${ colors . white }  ` ; 
120129  } 
121130
122131  return  `\n${ message }  ` ; 
@@ -129,17 +138,16 @@ function printMyersDiff(diff, operator) {
129138
130139  for  ( let  diffIdx  =  diff . length  -  1 ;  diffIdx  >=  0 ;  diffIdx -- )  { 
131140    const  {  type,  value }  =  diff [ diffIdx ] ; 
132-     const  previousType  =  ( diffIdx  <  ( diff . length  -  1 ) )  ? diff [ diffIdx  +  1 ] . type  : null ; 
133-     const  typeChanged  =  previousType  &&  ( type  !==  previousType ) ; 
141+     const  previousType  =  diffIdx  <  diff . length  -  1  ? diff [ diffIdx  +  1 ] . type  : null ; 
134142
135-     if  ( typeChanged   &&   previousType   ===   'nop' )   { 
136-        // Avoid grouping  if only one line would have been grouped otherwise 
143+     // Avoid grouping  if only one line would have been grouped otherwise 
144+     if  ( previousType   ===   'nop'   &&   type   !==   previousType )   { 
137145      if  ( nopCount  ===  kNopLinesToCollapse  +  1 )  { 
138146        message  +=  `${ colors . white }    ${ diff [ diffIdx  +  1 ] . value }  \n` ; 
139147      }  else  if  ( nopCount  ===  kNopLinesToCollapse  +  2 )  { 
140148        message  +=  `${ colors . white }    ${ diff [ diffIdx  +  2 ] . value }  \n` ; 
141149        message  +=  `${ colors . white }    ${ diff [ diffIdx  +  1 ] . value }  \n` ; 
142-       }  if  ( nopCount  >=  ( kNopLinesToCollapse  +  3 ) )  { 
150+       }  else   if  ( nopCount  >=  kNopLinesToCollapse  +  3 )  { 
143151        message  +=  `${ colors . blue }  ...${ colors . white }  \n` ; 
144152        message  +=  `${ colors . white }    ${ diff [ diffIdx  +  1 ] . value }  \n` ; 
145153        skipped  =  true ; 
0 commit comments