/// <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);
            }
        }
Beispiel #6
0
 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);
Beispiel #9
0
 /// <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);
Beispiel #10
0
 /// <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);