private FilteredCatalog Traverse(IComposablePartCatalogTraversal traversal) { Assumes.NotNull(traversal); // we make sure that the underlyiong catalog cannot change while we are doing the trasversal // After thaty traversal is done, the freeze is lifted, and the catalog is free to change, but the changes // cannot affect partitioning FreezeInnerCatalog(); try { traversal.Initialize(); var traversalClosure = GetTraversalClosure(_innerCatalog.Where(_filter), traversal); return(new FilteredCatalog(_innerCatalog, p => traversalClosure.Contains(p))); } finally { UnfreezeInnerCatalog(); } }
private static void GetTraversalClosure(IEnumerable <ComposablePartDefinition> parts, HashSet <ComposablePartDefinition> traversedParts, IComposablePartCatalogTraversal traversal) { foreach (var part in parts) { if (traversedParts.Add(part)) { IEnumerable <ComposablePartDefinition> partsToTraverse = null; if (traversal.TryTraverse(part, out partsToTraverse)) { GetTraversalClosure(partsToTraverse, traversedParts, traversal); } } } }
private static HashSet <ComposablePartDefinition> GetTraversalClosure(IEnumerable <ComposablePartDefinition> parts, IComposablePartCatalogTraversal traversal) { Assumes.NotNull(traversal); var traversedParts = new HashSet <ComposablePartDefinition>(); GetTraversalClosure(parts, traversedParts, traversal); return(traversedParts); }
private FilteredCatalog Traverse(IComposablePartCatalogTraversal traversal !!) {
private static HashSet <ComposablePartDefinition> GetTraversalClosure(IEnumerable <ComposablePartDefinition> parts, IComposablePartCatalogTraversal traversal) { if (traversal == null) { throw new ArgumentNullException(nameof(traversal)); } var traversedParts = new HashSet <ComposablePartDefinition>(); GetTraversalClosure(parts, traversedParts, traversal); return(traversedParts); }