public static IEnumerable<TItem> Replace<TSlot, TItem>( this ISlotContainer<TSlot, TItem> container, TItem item) where TSlot : ISlot where TItem : class, ISlotItem { Ensure.Any.IsNotNull(item, nameof(item)); var allSlots = item.GetAllSlots(); var occupiedSlots = OccupiedSlots(container); var slotsToFree = allSlots.Intersect(occupiedSlots); var itemsToFree = toSet( slotsToFree.Bind(s => FindItemInSlot(container, s)).Distinct()); itemsToFree.Iter(container.Remove); container.Add(item); return itemsToFree; }
public static IEnumerable <TItem> Replace <TSlot, TItem>( [NotNull] this ISlotContainer <TSlot, TItem> container, [NotNull] TItem item) where TSlot : ISlot where TItem : Node, ISlotItem { Ensure.Any.IsNotNull(item, nameof(item)); var allSlots = new HashSet <string>(item.GetAllSlots()); var occupiedSlots = new HashSet <string>(OccupiedSlots(container)); var slotsToFree = allSlots.Intersect(occupiedSlots); var itemsToFree = slotsToFree .Select(s => FindItem(container, s)) .Where(i => i != null) .Distinct() .ToList(); itemsToFree.ForEach(container.Remove); container.Add(item); return(itemsToFree); }