@@ -535,7 +535,77 @@ export class GPTController {
535535 }
536536 } ) ,
537537 ) ;
538-
539- return paperObjects ;
538+ const result = alignPassParts ( paperObjects . filter ( ( obj ) : obj is ai_GPTResponse => obj !== undefined ) ) ;
539+ return result ;
540540 }
541541}
542+
543+ /**
544+ * Sorts the parts component such that common parts across pass 1, 2 and 3 have the same index in the parts array
545+ * @param passes an array of ai_GPTResponse objects
546+ * @returns a new array of ai_GPTResponse objects with the parts aligned across pass 1, 2 and 3
547+ */
548+ function alignPassParts ( passes : ai_GPTResponse [ ] ) : ai_GPTResponse [ ] {
549+ return passes . map ( ( entry ) => {
550+ const prelim_result = sortParts (
551+ entry . pass_1 . parts ,
552+ entry . pass_2 . parts ,
553+ entry . pass_3 . parts
554+ ) ;
555+ return {
556+ ...entry ,
557+ pass_1 : {
558+ ...entry . pass_1 ,
559+ parts : prelim_result [ 0 ]
560+ } ,
561+ pass_2 : {
562+ ...entry . pass_2 ,
563+ parts : prelim_result [ 1 ]
564+ } ,
565+ pass_3 : {
566+ ...entry . pass_3 ,
567+ parts : prelim_result [ 2 ]
568+ }
569+ } ;
570+ } ) ;
571+ }
572+
573+ function sortParts (
574+ pass_1_parts : ai_part [ ] ,
575+ pass_2_parts : ai_part [ ] ,
576+ pass_3_parts : ai_part [ ]
577+ ) : [ ai_part [ ] , ai_part [ ] , ai_part [ ] ] {
578+ // Create sets of part names for each pass
579+ const pass_1_names = new Set ( pass_1_parts . map ( part => part . name ) ) ;
580+ const pass_2_names = new Set ( pass_2_parts . map ( part => part . name ) ) ;
581+ const pass_3_names = new Set ( pass_3_parts . map ( part => part . name ) ) ;
582+
583+ // Find common part names across all passes
584+ const commonNames = new Set (
585+ [ ...pass_1_names ] . filter (
586+ name => pass_2_names . has ( name ) && pass_3_names . has ( name )
587+ )
588+ ) ;
589+
590+ // Create maps to quickly lookup parts by name
591+ const pass_1_map = new Map ( pass_1_parts . map ( part => [ part . name , part ] ) ) ;
592+ const pass_2_map = new Map ( pass_2_parts . map ( part => [ part . name , part ] ) ) ;
593+ const pass_3_map = new Map ( pass_3_parts . map ( part => [ part . name , part ] ) ) ;
594+
595+ // Sort common parts based on the order in pass_1
596+ const commonParts_1 = Array . from ( commonNames ) . map ( name => pass_1_map . get ( name ) ! ) ;
597+ const commonParts_2 = commonParts_1 . map ( part => pass_2_map . get ( part . name ) ! ) ;
598+ const commonParts_3 = commonParts_1 . map ( part => pass_3_map . get ( part . name ) ! ) ;
599+
600+ // Collect uncommon parts for each pass
601+ const uncommonParts_1 = pass_1_parts . filter ( part => ! commonNames . has ( part . name ) ) ;
602+ const uncommonParts_2 = pass_2_parts . filter ( part => ! commonNames . has ( part . name ) ) ;
603+ const uncommonParts_3 = pass_3_parts . filter ( part => ! commonNames . has ( part . name ) ) ;
604+
605+ // Combine common and uncommon parts
606+ const sorted_pass_1 = [ ...commonParts_1 , ...uncommonParts_1 ] ;
607+ const sorted_pass_2 = [ ...commonParts_2 , ...uncommonParts_2 ] ;
608+ const sorted_pass_3 = [ ...commonParts_3 , ...uncommonParts_3 ] ;
609+
610+ return [ sorted_pass_1 , sorted_pass_2 , sorted_pass_3 ] ;
611+ }
0 commit comments