@@ -42,6 +42,80 @@ describe('IndexedSet', () => {
4242 } )
4343 } )
4444
45+ describe ( 'insertArrayAt' , ( ) => {
46+ it ( 'inserts an array of elements at the specified index' , ( ) => {
47+ const set = new IndexedSet < string > ( )
48+ set . insertArrayAt ( 0 , [ 'a' , 'b' , 'c' ] )
49+
50+ expect ( set . get ( 0 ) ) . toBe ( 'a' )
51+ expect ( set . get ( 1 ) ) . toBe ( 'b' )
52+ expect ( set . get ( 2 ) ) . toBe ( 'c' )
53+ expect ( set . size ) . toBe ( 3 )
54+ } )
55+
56+ it ( 'inserts elements in the middle' , ( ) => {
57+ const set = new IndexedSet < string > ( )
58+ set . insertArrayAt ( 0 , [ 'a' , 'c' ] )
59+ set . insertArrayAt ( 1 , [ 'b' ] )
60+
61+ expect ( set . get ( 0 ) ) . toBe ( 'a' )
62+ expect ( set . get ( 1 ) ) . toBe ( 'b' )
63+ expect ( set . get ( 2 ) ) . toBe ( 'c' )
64+ } )
65+
66+ it ( 'deduplicates elements' , ( ) => {
67+ const set = new IndexedSet < string > ( )
68+ set . insertArrayAt ( 0 , [ 'a' , 'b' ] )
69+ set . insertArrayAt ( 2 , [ 'b' , 'c' ] ) // 'b' should be ignored
70+
71+ expect ( set . size ) . toBe ( 3 )
72+ expect ( set . get ( 0 ) ) . toBe ( 'a' )
73+ expect ( set . get ( 1 ) ) . toBe ( 'b' )
74+ expect ( set . get ( 2 ) ) . toBe ( 'c' )
75+ } )
76+
77+ it ( 'handles empty arrays' , ( ) => {
78+ const set = new IndexedSet < string > ( )
79+ set . insertArrayAt ( 0 , [ 'a' , 'b' ] )
80+ set . insertArrayAt ( 0 , [ ] ) // empty array
81+
82+ expect ( set . size ) . toBe ( 2 )
83+ } )
84+
85+ it ( 'handles large arrays (500k elements) without stack overflow' , ( ) => {
86+ const set = new IndexedSet < number > ( )
87+ // Use 500k elements to ensure we test beyond the typical call stack limit
88+ // which causes "Maximum call stack size exceeded" when using spread with splice
89+ const largeArray = Array . from ( { length : 500000 } , ( _ , i ) => i )
90+
91+ // Use insertArrayAt for large arrays to avoid spread operator stack overflow
92+ expect ( ( ) => {
93+ set . insertArrayAt ( 0 , largeArray )
94+ } ) . not . toThrow ( )
95+
96+ expect ( set . size ) . toBe ( 500000 )
97+ expect ( set . get ( 0 ) ) . toBe ( 0 )
98+ expect ( set . get ( 499999 ) ) . toBe ( 499999 )
99+ expect ( set . has ( 250000 ) ) . toBe ( true )
100+ } )
101+
102+ it ( 'handles inserting large arrays at middle positions' , ( ) => {
103+ const set = new IndexedSet < number > ( )
104+ set . insertAt ( 0 , - 2 , - 1 )
105+ const largeArray = Array . from ( { length : 500000 } , ( _ , i ) => i )
106+
107+ // Use insertArrayAt for large arrays to avoid spread operator stack overflow
108+ expect ( ( ) => {
109+ set . insertArrayAt ( 1 , largeArray )
110+ } ) . not . toThrow ( )
111+
112+ expect ( set . size ) . toBe ( 500002 )
113+ expect ( set . get ( 0 ) ) . toBe ( - 2 )
114+ expect ( set . get ( 1 ) ) . toBe ( 0 )
115+ expect ( set . get ( 500001 ) ) . toBe ( - 1 )
116+ } )
117+ } )
118+
45119 describe ( 'delete' , ( ) => {
46120 it ( 'removes an element and returns true' , ( ) => {
47121 const set = new IndexedSet < string > ( )
0 commit comments