@@ -57,7 +57,7 @@ export default function diff<T>(A: T[], B: T[]): DiffResult<T>[] {
57
57
}
58
58
59
59
function createFP ( slide : FarthestPoint , down : FarthestPoint , k : number , M : number , N : number ) : FarthestPoint {
60
- if ( slide && slide . y === - 1 && ( down && down . y === - 1 ) ) return { y : 0 , id : 0 } ;
60
+ if ( slide && slide . y === - 1 && down && down . y === - 1 ) return { y : 0 , id : 0 } ;
61
61
if ( ( down && down . y === - 1 ) || k === M || ( slide && slide . y ) > ( down && down . y ) + 1 ) {
62
62
const prev = slide . id ;
63
63
ptr ++ ;
@@ -108,11 +108,11 @@ export default function diff<T>(A: T[], B: T[]): DiffResult<T>[] {
108
108
const offset = N ;
109
109
const delta = M - N ;
110
110
const size = M + N + 1 ;
111
- const fp = new Array ( size ) . fill ( { y : - 1 } ) ;
111
+ let fp = new Array ( size ) . fill ( { y : - 1 } ) ;
112
112
// INFO: This buffer is used to save memory and improve performance.
113
113
// The first half is used to save route and last half is used to save diff type.
114
114
// This is because, when I kept new uint8array area to save type, performance worsened.
115
- const routes = new Uint32Array ( ( M * N + size + 1 ) * 2 ) ;
115
+ let routes = new Uint32Array ( ( M * N + size + 1 ) * 2 ) ;
116
116
const diffTypesPtrOffset = routes . length / 2 ;
117
117
let ptr = 0 ;
118
118
let p = - 1 ;
@@ -126,9 +126,17 @@ export default function diff<T>(A: T[], B: T[]): DiffResult<T>[] {
126
126
}
127
127
fp [ delta + offset ] = snake ( delta , fp [ delta - 1 + offset ] , fp [ delta + 1 + offset ] , offset , A , B ) ;
128
128
}
129
- return [
130
- ...prefixCommon . map ( c => ( { type : 'common' as DiffType , value : c } ) ) ,
131
- ...backTrace ( A , B , fp [ delta + offset ] , swapped ) ,
132
- ...suffixCommon . map ( c => ( { type : 'common' as DiffType , value : c } ) ) ,
133
- ] ;
129
+ const pre = prefixCommon . map ( c => ( { type : 'common' as DiffType , value : c } ) ) ;
130
+ const traced = backTrace ( A , B , fp [ delta + offset ] , swapped ) ;
131
+ const suf = suffixCommon . map ( c => ( { type : 'common' as DiffType , value : c } ) ) ;
132
+
133
+ // cleanup
134
+ ( routes as any ) = null ;
135
+ ( fp as any ) = null ;
136
+
137
+ if ( 'flat' in Array . prototype ) {
138
+ return [ pre , traced , suf ] . flat ( ) ;
139
+ } else {
140
+ return [ ...pre , ...traced , ...suf ] . flat ( ) ;
141
+ }
134
142
}
0 commit comments