1# CMD: Prints the longest distance each module has from a leaf in the module graph within the transitive closure of given module 2 3include "library"; 4 5def onlyDeps: 6 { Name: .Name, Deps: .Deps | map(.Name) } 7; 8 9def mergeDepsForSameModule: 10 group_by(.Name) | map({Name: .[0].Name, Deps: map(.Deps) | flatten | unique | sort}) 11; 12 13def toMergeMap: 14 map({key: .Name, value: .Deps}) | from_entries 15; 16 17def moduleGraphNoVariants: 18 map(onlyDeps) | mergeDepsForSameModule | toMergeMap 19; 20 21def removeSelfEdges: 22 to_entries | 23 map(.key as $key | {key: .key, value: .value | [.[] | select(. != $key)]}) | 24 from_entries 25; 26 27def nextDepths($m): 28 . as $old | 29 to_entries | 30 map({ 31 key: .key, 32 value: ( 33 .key as $key | 34 $m[.key] // [] | 35 map($old[.]) | 36 if any(. == -1) then -1 else (max // -1) + 1 end 37 ) 38 }) | 39 from_entries 40; 41 42def maxDepths($m): 43 map({key: ., value: -1}) | from_entries | 44 {Prev: [], Next: .} | 45 until (.Prev == .Next; {Prev: .Next, Next: .Next | nextDepths($m)}) | 46 .Next 47; 48 49def variantlessDistancesFromLeaves($root): 50 (moduleGraphNoVariants | removeSelfEdges) as $m | 51 [$root] | 52 transitiveDeps($m) | 53 maxDepths($m) 54; 55 56variantlessDistancesFromLeaves($arg) 57