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); } } }
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); } } }
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); } }