public static void CallInSequence <T>(System.Action callback, IEnumerable <T> collection, System.Action <T, System.Action> each, bool waitPrevious = false) { if (collection == null) { if (callback != null) { callback.Invoke(); } return; } var count = collection.Count(); var completed = false; var counter = 0; System.Action callbackItem = () => { ++counter; if (counter < count) { return; } completed = true; if (callback != null) { callback(); } }; if (waitPrevious == true) { var ie = collection.GetEnumerator(); System.Action doNext = null; doNext = () => { if (Coroutines.MoveNext(ie, collection) == true) { if (ie.Current != null) { each(ie.Current, () => { callbackItem(); doNext(); }); } else { callbackItem(); doNext(); } } }; doNext(); } else { var ie = collection.GetEnumerator(); while (Coroutines.MoveNext(ie, collection) == true) { if (ie.Current != null) { each(ie.Current, callbackItem); } else { callbackItem(); } if (completed == true) { break; } } } if (count == 0 && callback != null) { callback(); } }
public static void CallInSequence <T, TClosure>(ref TClosure closure, ClosureDelegateCallback <TClosure> callback, IEnumerable <T> collection, ClosureDelegateEachCallback <T, TClosure> each, bool waitPrevious = false) { if (collection == null) { if (callback != null) { callback.Invoke(ref closure); } return; } var count = collection.Count(); var completed = false; var counter = 0; ClosureDelegateCallback <TClosure> callbackItem = (ref TClosure cParamsInner) => { ++counter; if (counter < count) { return; } completed = true; if (callback != null) { callback.Invoke(ref cParamsInner); } }; if (waitPrevious == true) { var ie = collection.GetEnumerator(); ClosureDelegateCallback <TClosure> doNext = null; doNext = (ref TClosure cParamsInner) => { if (Coroutines.MoveNext(ie, collection) == true) { if (ie.Current != null) { each.Invoke(ie.Current, (ref TClosure cParams) => { callbackItem(ref cParams); doNext(ref cParams); }, ref cParamsInner); } else { callbackItem.Invoke(ref cParamsInner); doNext.Invoke(ref cParamsInner); } } }; doNext.Invoke(ref closure); } else { var ie = collection.GetEnumerator(); while (Coroutines.MoveNext(ie, collection) == true) { if (ie.Current != null) { each.Invoke(ie.Current, callbackItem, ref closure); } else { callbackItem.Invoke(ref closure); } if (completed == true) { break; } } } if (count == 0 && callback != null) { callback(ref closure); } }