@@ -33,15 +33,9 @@ module.exports = function (a_, b_) {
3333 m = a . length ,
3434 n = b . length ,
3535 reverse = false ,
36- ed = null ,
3736 offset = m + 1 ,
3837 path = [ ] ,
39- pathposi = [ ] ,
40- ses = [ ] ,
41- lcs = "" ,
42- SES_DELETE = - 1 ,
43- SES_COMMON = 0 ,
44- SES_ADD = 1 ;
38+ pathposi = [ ] ;
4539
4640 var tmp1 ,
4741 tmp2 ;
@@ -59,92 +53,45 @@ module.exports = function (a_, b_) {
5953 }
6054 } ;
6155
62- var P = function ( x , y , k ) {
56+ var P = function ( startX , startY , endX , endY , r ) {
6357 return {
64- 'x' : x ,
65- 'y' : y ,
66- 'k' : k ,
67- } ;
68- } ;
69-
70- var seselem = function ( elem , t ) {
71- return {
72- 'elem' : elem ,
73- 't' : t ,
58+ startX,
59+ startY,
60+ endX,
61+ endY,
62+ r
7463 } ;
7564 } ;
7665
7766 var snake = function ( k , p , pp ) {
78- var r , x , y ;
67+ var r , x , y , startX , startY ;
7968 if ( p > pp ) {
8069 r = path [ k - 1 + offset ] ;
8170 } else {
8271 r = path [ k + 1 + offset ] ;
8372 }
8473
85- y = Math . max ( p , pp ) ;
86- x = y - k ;
74+ startY = y = Math . max ( p , pp ) ;
75+ startX = x = y - k ;
8776 while ( x < m && y < n && a [ x ] === b [ y ] ) {
8877 ++ x ;
8978 ++ y ;
9079 }
9180
92- path [ k + offset ] = pathposi . length ;
93- pathposi [ pathposi . length ] = new P ( x , y , r ) ;
94- return y ;
95- } ;
96-
97- var recordseq = function ( epc ) {
98- var x_idx , y_idx , px_idx , py_idx , i ;
99- x_idx = y_idx = 1 ;
100- px_idx = py_idx = 0 ;
101- for ( i = epc . length - 1 ; i >= 0 ; -- i ) {
102- while ( px_idx < epc [ i ] . x || py_idx < epc [ i ] . y ) {
103- if ( epc [ i ] . y - epc [ i ] . x > py_idx - px_idx ) {
104- if ( reverse ) {
105- ses [ ses . length ] = new seselem ( b [ py_idx ] , SES_DELETE ) ;
106- } else {
107- ses [ ses . length ] = new seselem ( b [ py_idx ] , SES_ADD ) ;
108- }
109- ++ y_idx ;
110- ++ py_idx ;
111- } else if ( epc [ i ] . y - epc [ i ] . x < py_idx - px_idx ) {
112- if ( reverse ) {
113- ses [ ses . length ] = new seselem ( a [ px_idx ] , SES_ADD ) ;
114- } else {
115- ses [ ses . length ] = new seselem ( a [ px_idx ] , SES_DELETE ) ;
116- }
117- ++ x_idx ;
118- ++ px_idx ;
119- } else {
120- ses [ ses . length ] = new seselem ( a [ px_idx ] , SES_COMMON ) ;
121- lcs += a [ px_idx ] ;
122- ++ x_idx ;
123- ++ y_idx ;
124- ++ px_idx ;
125- ++ py_idx ;
126- }
127- }
81+ if ( startX == x && startY == y ) {
82+ path [ k + offset ] = r ;
83+ } else {
84+ path [ k + offset ] = pathposi . length ;
85+ pathposi [ pathposi . length ] = new P ( startX , startY , x , y , r ) ;
12886 }
87+ return y ;
12988 } ;
13089
13190 init ( ) ;
13291
13392 return {
134- SES_DELETE : - 1 ,
135- SES_COMMON : 0 ,
136- SES_ADD : 1 ,
137- editdistance : function ( ) {
138- return ed ;
139- } ,
140- getlcs : function ( ) {
141- return lcs ;
142- } ,
143- getses : function ( ) {
144- return ses ;
145- } ,
14693 compose : function ( ) {
147- var delta , size , fp , p , r , epc , i , k ;
94+ var delta , size , fp , p , r , i , k , lastStartX , lastStartY , result ;
14895 delta = n - m ;
14996 size = m + n + 3 ;
15097 fp = { } ;
@@ -167,13 +114,39 @@ module.exports = function (a_, b_) {
167114 ed = delta + 2 * p ;
168115
169116 r = path [ delta + offset ] ;
170-
171- epc = [ ] ;
117+ lastStartX = m ;
118+ lastStartY = n ;
119+ result = [ ] ;
172120 while ( r !== - 1 ) {
173- epc [ epc . length ] = new P ( pathposi [ r ] . x , pathposi [ r ] . y , null ) ;
174- r = pathposi [ r ] . k ;
121+ let elem = pathposi [ r ] ;
122+ if ( m != elem . endX || n != elem . endY ) {
123+ result . push ( {
124+ file1 : [
125+ reverse ? elem . endY : elem . endX ,
126+ reverse ? lastStartY - elem . endY : lastStartX - elem . endX
127+ ] ,
128+ file2 : [
129+ reverse ? elem . endX : elem . endY ,
130+ reverse ? lastStartX - elem . endX : lastStartY - elem . endY
131+ ]
132+ } ) ;
133+ }
134+
135+ lastStartX = elem . startX ;
136+ lastStartY = elem . startY ;
137+
138+ r = pathposi [ r ] . r ;
139+ }
140+
141+ if ( lastStartX != 0 || lastStartY != 0 ) {
142+ result . push ( {
143+ file1 : [ 0 , reverse ? lastStartY : lastStartX ] ,
144+ file2 : [ 0 , reverse ? lastStartX : lastStartY ]
145+ } )
175146 }
176- recordseq ( epc ) ;
147+
148+ result . reverse ( ) ;
149+ return result ;
177150 }
178151 } ;
179152} ;
0 commit comments