예제 #1
0
        public static IEnumerable Duplicate <T>(this IEnumerable coroutine,
                                                Func <FireData, IEnumerable <T> > duplicationFunc,
                                                Action <FireData, T> editFunc = null,
                                                bool includeOriginal          = true,
                                                Func <FireData, bool> filter  = null)
        {
            if (duplicationFunc == null)
            {
                throw new ArgumentNullException("duplicationFunc");
            }
            if (coroutine == null)
            {
                yield break;
            }

            var alterDummy = new FireData();

            foreach (var obj in coroutine)
            {
                var fd = obj as FireData;
                if (fd == null || (filter != null && filter(fd)))
                {
                    yield return(obj);

                    continue;
                }
                if (includeOriginal)
                {
                    yield return(fd);
                }
                IEnumerable <T> alterations = duplicationFunc(fd);
                if (alterations == null)
                {
                    continue;
                }
                foreach (T alteration in duplicationFunc(fd))
                {
                    alterDummy.Copy(fd);
                    editFunc.SafeInvoke(alterDummy, alteration);
                    yield return(alterDummy);
                }
            }
        }
예제 #2
0
        public static IEnumerable Burst(this IEnumerable coroutine,
                                        Func <FireData, int> count,
                                        Action <FireData> delta      = null,
                                        Action <FireData, int> setup = null,
                                        Func <FireData, bool> filter = null)
        {
            if (count == null)
            {
                throw new ArgumentNullException("count");
            }
            if (coroutine == null)
            {
                yield break;
            }

            FireData copy = new FireData();

            foreach (var obj in coroutine)
            {
                var fd = obj as FireData;
                if (fd == null || (filter != null && filter(fd)))
                {
                    yield return(obj);

                    continue;
                }
                copy.Copy(fd);
                int currentCount = count(fd);
                if (setup != null)
                {
                    setup(fd, currentCount);
                }
                for (var i = 0; i < currentCount; i++)
                {
                    yield return(copy);

                    delta.SafeInvoke(copy);
                }
            }
        }
예제 #3
0
            IEnumerator Unfiltered()
            {
                if (coroutine == null)
                {
                    yield break;
                }

                var copy = new FireData();

                foreach (object data in coroutine)
                {
                    var fd = data as FireData;
                    if (fd == null)
                    {
                        yield return(data);

                        continue;
                    }
                    copy.Copy(fd);
                    actions(copy);
                    yield return(copy);
                }
            }