@@ -45,6 +45,9 @@ module Node = {
4545 module OS = {
4646 @module ("os" )
4747 external tmpdir : unit => string = "tmpdir"
48+
49+ @module ("os" )
50+ external cpus : unit => array <{.}> = "cpus"
4851 }
4952
5053 module Util = {
@@ -280,6 +283,23 @@ let getCodeBlocks = example => {
280283 -> Array .join ("\n\n " )
281284}
282285
286+ let chunkArray = (array , chunkSize ) => {
287+ let result = []
288+
289+ let rec loop = (i : int ) => {
290+ if i < Array .length (array ) {
291+ Array .push (
292+ result ,
293+ Array .slice (array , ~start = i , ~end = Math .Int .min (i + chunkSize , Array .length (array ))),
294+ )
295+ loop (i + chunkSize )
296+ }
297+ }
298+
299+ loop (0 )
300+ result
301+ }
302+
283303let main = async () => {
284304 let files = Fs .readdirSync ("runtime" )
285305
@@ -327,28 +347,55 @@ let main = async () => {
327347 (lhs , rhs )
328348 })
329349
330- let runtimeErrors =
331- (await compiled
332- -> Array .filter ((({id }, _ , _ )) => ! Array .includes (ignoreRuntimeTests , id ))
333- -> Array .map (async ((example , rescriptCode , jsCode )) => {
334- let nodeTests = await jsCode -> runtimeTests
335- switch nodeTests {
336- | Ok (_ ) => None
337- | Error (error ) => Some (example , RuntimeError ({rescript : rescriptCode , js : jsCode , error }))
338- }
350+ let batchSize = OS .cpus ()-> Array .length
351+ let batches = chunkArray (compiled , batchSize )
352+
353+ let a =
354+ await batches
355+ -> Array .map (async t => {
356+ (await t
357+ -> Array .filter ((({id }, _ , _ )) => ! Array .includes (ignoreRuntimeTests , id ))
358+ -> Array .map (async ((example , rescriptCode , jsCode )) => {
359+ let nodeTest = await runtimeTests (jsCode )
360+ switch nodeTest {
361+ | Ok (_ ) => None
362+ | Error (error ) => Some (example , RuntimeError ({rescript : rescriptCode , js : jsCode , error }))
363+ }
364+ })
365+ -> Promise .all )
366+ -> Array .filterMap (i =>
367+ switch i {
368+ | Some (i ) => Some (i )
369+ | None => None
370+ }
371+ )
339372 })
340- -> Promise .all )
341- -> Array .filterMap (i =>
342- switch i {
343- | Some (i ) => Some (i )
344- | None => None
345- }
346- )
373+ -> Promise .all
347374
348- let allErros = Array .concat (runtimeErrors , compilationErrors )
375+ let runtimeErrors = Array .flat (a )
376+
377+ // let runtimeErrors =
378+ // (await compiled
379+ // ->Array.filter((({id}, _, _)) => !Array.includes(ignoreRuntimeTests, id))
380+ // ->Array.map(async ((example, rescriptCode, jsCode)) => {
381+ // let nodeTests = await jsCode->runtimeTests
382+ // switch nodeTests {
383+ // | Ok(_) => None
384+ // | Error(error) => Some(example, RuntimeError({rescript: rescriptCode, js: jsCode, error}))
385+ // }
386+ // })
387+ // ->Promise.all)
388+ // ->Array.filterMap(i =>
389+ // switch i {
390+ // | Some(i) => Some(i)
391+ // | None => None
392+ // }
393+ // )
394+
395+ let allErrors = Array .concat (runtimeErrors , compilationErrors )
349396
350397 // Print Errors
351- let () = allErros -> Array .forEach (((example , errors )) => {
398+ let () = allErrors -> Array .forEach (((example , errors )) => {
352399 let red = s => ` \x1B [1;31m${s}\x1B [0m`
353400 let cyan = s => ` \x1b [36m${s}\x1b [0m`
354401 let kind = switch example .kind {
@@ -389,7 +436,7 @@ ${error->indentOutputCode}
389436 Process .stderrWrite (a )
390437 })
391438
392- let someError = allErros -> Array .length > 0
439+ let someError = allErrors -> Array .length > 0
393440
394441 someError ? 1 : 0
395442}
0 commit comments