Example #1
0
        public void SecondPass()
        {
            KeyValuePair <C, B> firstItem;

            _di4.TryGetFirst(out firstItem);

            var lambdaCarrier = new AtomicDictionary <uint, Lambda>();
            KeyValueUpdate <C, B> updateFunction = delegate(C k, B i) { return(i.Update(lambdaCarrier.Values)); };
            List <uint> keysToRemove             = new List <uint>();
            List <uint> keys;

            foreach (var bookmark in _di4.EnumerateFrom(firstItem.Key))
            {
                foreach (var lambda in bookmark.Value.lambda)
                {
                    lambdaCarrier.AddOrUpdate(lambda.atI, lambda);
                    if (lambda.phi == Phi.RightEnd)
                    {
                        keysToRemove.Add(lambda.atI);
                    }
                }

                if (UpdateRequired(bookmark.Value.lambda, lambdaCarrier))
                {
                    _di4.TryUpdate(bookmark.Key, updateFunction);
                }

                foreach (uint item in keysToRemove)
                {
                    lambdaCarrier.Remove(item);
                }
                keysToRemove.Clear();

                keys = new List <uint>(lambdaCarrier.Keys);
                foreach (var key in keys)
                {
                    lambdaCarrier[key] = new Lambda(Phi.Middle, lambdaCarrier[key].atI, _collectionID);
                }
            }
        }