@@ -94,6 +94,48 @@ Deno.test('MeekValueMap: get', () => {
9494 assert ( pairs ) ;
9595} ) ;
9696
97+ Deno . test ( 'MeekValueMap: getOrInsert' , ( ) => {
98+ const pairs : readonly [ number , { i : number } ] [ ] = new Array ( 100 ) . fill ( 0 )
99+ . map ( ( _ , i ) => [ i , { i } ] ) ;
100+ const map = new MeekValueMap ( ) ;
101+ for ( let i = 0 ; i < pairs . length ; i ++ ) {
102+ const [ k , v ] = pairs [ i ] ;
103+ assertStrictEquals ( map . has ( k ) , false ) ;
104+ assertStrictEquals ( map . getOrInsert ( k , v ) , v ) ;
105+ assertStrictEquals ( map . has ( k ) , true ) ;
106+ assertStrictEquals ( map . get ( k ) , v ) ;
107+ const o = { i : - i } ;
108+ assertStrictEquals ( map . getOrInsert ( k , o ) , v ) ;
109+ assertStrictEquals ( map . get ( k ) , v ) ;
110+ }
111+ assert ( pairs ) ;
112+ } ) ;
113+
114+ Deno . test ( 'MeekValueMap: getOrInsertComputed' , ( ) => {
115+ const uncalled = ( ) => {
116+ throw new Error ( 'Should not be called' ) ;
117+ } ;
118+ const pairs : readonly [ number , { i : number } ] [ ] = new Array ( 100 ) . fill ( 0 )
119+ . map ( ( _ , i ) => [ i , { i } ] ) ;
120+ const map = new MeekValueMap ( ) ;
121+ for ( let i = 0 ; i < pairs . length ; i ++ ) {
122+ const [ k , v ] = pairs [ i ] ;
123+ assertStrictEquals ( map . has ( k ) , false ) ;
124+ assertStrictEquals (
125+ map . getOrInsertComputed ( k , ( key ) => {
126+ assertStrictEquals ( key , k ) ;
127+ return v ;
128+ } ) ,
129+ v ,
130+ ) ;
131+ assertStrictEquals ( map . has ( k ) , true ) ;
132+ assertStrictEquals ( map . get ( k ) , v ) ;
133+ assertStrictEquals ( map . getOrInsertComputed ( k , uncalled ) , v ) ;
134+ assertStrictEquals ( map . get ( k ) , v ) ;
135+ }
136+ assert ( pairs ) ;
137+ } ) ;
138+
97139Deno . test ( 'MeekValueMap: set' , ( ) => {
98140 const pairs : readonly [ number , { i : number } ] [ ] = new Array ( 100 ) . fill ( 0 )
99141 . map ( ( _ , i ) => [ i , { i } ] ) ;
@@ -242,36 +284,22 @@ Deno.test('MeekValueMap: Symbol.toStringTag', () => {
242284 ) ;
243285} ) ;
244286
245- Deno . test ( 'MeekValueMap: GC' , async ( ) => {
287+ Deno . test ( 'MeekValueMap: GC set ' , async ( ) => {
246288 await forceGC ( ( map , key , value ) => {
247289 map . set ( key , value ) ;
248290 } ) ;
249291} ) ;
250292
251- Deno . test ( 'MeekValueMap: modify while iterating' , ( ) => {
252- const pairs : readonly [ number , { i : number } ] [ ] = new Array ( 100 ) . fill ( 0 )
253- . map ( ( _ , i ) => [ i , { i } ] ) ;
254- const mapExpt = new Map ( pairs . slice ( 0 , 60 ) ) ;
255- const mapTest = new MeekValueMap ( pairs . slice ( 0 , 60 ) ) ;
256- const readWhileModify = ( map : Map < number , WeakKey > | MeekValueMap ) => {
257- const r : number [ ] = [ ] ;
258- let i = 0 ;
259- for ( const [ k ] of map ) {
260- r . push ( k ) ;
261- map . delete ( pairs [ k + 1 ] [ 0 ] ) ;
262- if ( i ++ === 10 ) {
263- map . clear ( ) ;
264- for ( const [ k , v ] of pairs . slice ( 50 ) ) {
265- map . set ( k , v ) ;
266- }
267- }
268- }
269- return r ;
270- } ;
271- const valExpt = readWhileModify ( mapExpt ) ;
272- const valTest = readWhileModify ( mapTest ) ;
273- assertEquals ( valExpt , valTest ) ;
274- assert ( pairs ) ;
293+ Deno . test ( 'MeekValueMap: GC getOrInsert' , async ( ) => {
294+ await forceGC ( ( map , key , value ) => {
295+ map . getOrInsert ( key , value ) ;
296+ } ) ;
297+ } ) ;
298+
299+ Deno . test ( 'MeekValueMap: GC getOrInsertComputed' , async ( ) => {
300+ await forceGC ( ( map , key , value ) => {
301+ map . getOrInsertComputed ( key , ( ) => value ) ;
302+ } ) ;
275303} ) ;
276304
277305/*
0 commit comments