/// <summary> /// Constructs a <see cref="IBidirectionalList{T}"/> given <paramref name="values"/>. /// </summary> /// <param name="values"></param> /// <param name="onAdded"></param> /// <param name="onRemoved"></param> /// <param name="onAdding"></param> /// <param name="onRemoving"></param> /// <inheritdoc /> public BidirectionalList(IEnumerable <T> values , BidirectionalListItemCallback <T> onAdded , BidirectionalListItemCallback <T> onRemoved , BidirectionalListItemCallback <T> onAdding = null , BidirectionalListItemCallback <T> onRemoving = null) : this(values.ToList(), onAdded, onRemoved, onAdding, onRemoving) { }
// ReSharper disable once RedundantEmptyObjectOrCollectionInitializer /// <summary> /// Construct a <see cref="IBidirectionalList{T}"/> given the set of /// <see cref="BidirectionalListItemCallback{T}"/>. /// </summary> /// <param name="onAdded"></param> /// <param name="onRemoved"></param> /// <param name="onAdding"></param> /// <param name="onRemoving"></param> /// <inheritdoc /> public BidirectionalList(BidirectionalListItemCallback <T> onAdded , BidirectionalListItemCallback <T> onRemoved , BidirectionalListItemCallback <T> onAdding = null , BidirectionalListItemCallback <T> onRemoving = null) : this(new List <T> { }, onAdded, onRemoved, onAdding, onRemoving) { }
protected override void ConnectCallbacks(IBidirectionalList <T> list , BidirectionalListItemCallback <T> onCallingBack, BidirectionalListItemCallback <T> onCalledBack) { Assert.NotNull(onCallingBack); Assert.NotNull(onCalledBack); list.RemovingItem += onCallingBack; list.RemovedItem += onCalledBack; }
/// <summary> /// Constructs a <see cref="IBidirectionalList{T}"/> given <paramref name="values"/>. /// </summary> /// <param name="values"></param> /// <param name="onAdded"></param> /// <param name="onRemoved"></param> /// <param name="onAdding"></param> /// <param name="onRemoving"></param> public BidirectionalList(IList <T> values , BidirectionalListItemCallback <T> onAdded , BidirectionalListItemCallback <T> onRemoved , BidirectionalListItemCallback <T> onAdding = null , BidirectionalListItemCallback <T> onRemoving = null) { var defaultItemCallback = DefaultItemCallback; // Connect the Bidirectional Item callback conditionally when there is a Callback. void ConnectBidiCallback(BidirectionalListItemCallback <T> callback , Action <BidirectionalList <T>, BidirectionalListItemCallback <T> > onConnect) { if (callback != null) { onConnect.Invoke(this, callback); } } ConnectBidiCallback(onAdded, (x, callback) => x.AddedItem += callback); ConnectBidiCallback(onAdding, (x, callback) => x.AddingItem += callback); ConnectBidiCallback(onRemoved, (x, callback) => x.RemovedItem += callback); ConnectBidiCallback(onRemoving, (x, callback) => x.RemovingItem += callback); // Effectively we are also Adding the items to the initial Collection instance. foreach (var x in values) { AddingItem?.Invoke(x); } Collection = values; foreach (var x in values) { AddedItem?.Invoke(x); } }
/// <summary> /// Constructs a <see cref="IBidirectionalList{T}"/> given <paramref name="values"/>. /// </summary> /// <param name="values"></param> /// <param name="onAdded"></param> /// <param name="onRemoved"></param> /// <param name="onAdding"></param> /// <param name="onRemoving"></param> public BidirectionalList(IList <T> values , BidirectionalListItemCallback <T> onAdded = null , BidirectionalListItemCallback <T> onRemoved = null , BidirectionalListItemCallback <T> onAdding = null , BidirectionalListItemCallback <T> onRemoving = null) { AddedItem += onAdded ?? DefaultCallback(); AddingItem += onAdding ?? DefaultCallback(); RemovedItem += onRemoved ?? DefaultCallback(); RemovingItem += onRemoving ?? DefaultCallback(); // Effectively we are also Adding the items to the initial Collection instance. foreach (var x in values) { AddingItem?.Invoke(x); } _collection = values; foreach (var x in values) { AddedItem?.Invoke(x); } }
protected override IBidirectionalList <int> CreateBidirectionalList(Func <IEnumerable <int> > getValues , BidirectionalListItemCallback <int> beforeCallback, BidirectionalListItemCallback <int> afterCallback) => getValues().ToBidirectionalList(onAdded: null, onRemoved: afterCallback , onAdding: null, onRemoving: beforeCallback);
/// <summary> /// /// </summary> /// <param name="getValues"></param> /// <param name="beforeCallback"></param> /// <param name="afterCallback"></param> /// <returns></returns> protected abstract IBidirectionalList <T> CreateBidirectionalList(Func <IEnumerable <T> > getValues , BidirectionalListItemCallback <T> beforeCallback, BidirectionalListItemCallback <T> afterCallback);
protected override IBidirectionalList <T> CreateBidirectionalList(Func <IEnumerable <T> > getValues , BidirectionalListItemCallback <T> beforeCallback, BidirectionalListItemCallback <T> afterCallback) => new BidirectionalList <T>(getValues(), onRemoved: afterCallback, onRemoving: beforeCallback);
/// <summary> /// Returns a <see cref="BidirectionalList{T}"/> corresponding to the /// <paramref name="values"/>. Provides <paramref name="onAdded"/>, /// <paramref name="onRemoved"/>, <paramref name="onAdding"/>, and /// <paramref name="onRemoving"/> callbacks. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="values"></param> /// <param name="onAdded"></param> /// <param name="onRemoved"></param> /// <param name="onAdding"></param> /// <param name="onRemoving"></param> /// <returns></returns> public static BidirectionalList <T> ToBidirectionalList <T>(this IList <T> values , BidirectionalListItemCallback <T> onAdded, BidirectionalListItemCallback <T> onRemoved , BidirectionalListItemCallback <T> onAdding, BidirectionalListItemCallback <T> onRemoving) => new BidirectionalList <T>(values, onAdded, onRemoved, onAdding, onRemoving);
/// <summary> /// Returns a <see cref="BidirectionalList{T}"/> corresponding to the /// <paramref name="values"/>. Provides <paramref name="onAdded"/> and /// <paramref name="onRemoved"/> callbacks. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="values"></param> /// <param name="onAdded"></param> /// <param name="onRemoved"></param> /// <returns></returns> public static BidirectionalList <T> ToBidirectionalList <T>(this IEnumerable <T> values , BidirectionalListItemCallback <T> onAdded, BidirectionalListItemCallback <T> onRemoved) => new BidirectionalList <T>(values, onAdded, onRemoved);