@@ -226,27 +226,40 @@ export const relatedConcepts = (concept: LocalConceptDataInput): string[] => {
226226 return [ ...new Set ( relations ) ] ;
227227} ;
228228
229- const orderConceptsRec = (
230- ordered : LocalConceptDataInput [ ] ,
231- concept : LocalConceptDataInput ,
232- remainder : { [ key : string ] : LocalConceptDataInput } ,
233- ) : Set < string > => {
229+ const orderConceptsRec = ( {
230+ ordered,
231+ concept,
232+ remainder,
233+ processed,
234+ } : {
235+ ordered : LocalConceptDataInput [ ] ;
236+ concept : LocalConceptDataInput ;
237+ remainder : { [ key : string ] : LocalConceptDataInput } ;
238+ processed : Set < string > ;
239+ } ) : Set < string > => {
234240 const relatedConceptIds = relatedConcepts ( concept ) ;
235241 let missing : Set < string > = new Set ( ) ;
236242 while ( relatedConceptIds . length > 0 ) {
237243 const relatedConceptId = relatedConceptIds . shift ( ) ! ;
244+ if ( processed . has ( relatedConceptId ) ) continue ;
238245 const relatedConcept = remainder [ relatedConceptId ] ;
239246 if ( relatedConcept === undefined ) {
240247 missing . add ( relatedConceptId ) ;
241248 } else {
242249 missing = new Set ( [
243250 ...missing ,
244- ...orderConceptsRec ( ordered , relatedConcept , remainder ) ,
251+ ...orderConceptsRec ( {
252+ ordered,
253+ concept : relatedConcept ,
254+ remainder,
255+ processed,
256+ } ) ,
245257 ] ) ;
246258 delete remainder [ relatedConceptId ] ;
247259 }
248260 }
249261 ordered . push ( concept ) ;
262+ processed . add ( concept . source_local_id ! ) ;
250263 delete remainder [ concept . source_local_id ! ] ;
251264 return missing ;
252265} ;
@@ -273,11 +286,17 @@ export const orderConceptsByDependency = (
273286 ) as { [ key : string ] : LocalConceptDataInput } ;
274287 const ordered : LocalConceptDataInput [ ] = [ ] ;
275288 let missing : Set < string > = new Set ( ) ;
289+ const processed : Set < string > = new Set ( ) ;
276290 while ( Object . keys ( conceptById ) . length > 0 ) {
277291 const first = Object . values ( conceptById ) [ 0 ] ;
278292 missing = new Set ( [
279293 ...missing ,
280- ...orderConceptsRec ( ordered , first , conceptById ) ,
294+ ...orderConceptsRec ( {
295+ ordered,
296+ concept : first ,
297+ remainder : conceptById ,
298+ processed,
299+ } ) ,
281300 ] ) ;
282301 }
283302 return { ordered, missing : [ ...missing ] } ;
0 commit comments