public static IEnumerable Partition(bool all, int size, int step, IEnumerable pad, IEnumerable seq) { if (size <= 0) { throw new LispException("Invalid size: {0}", size); } if (step <= 0) { throw new LispException("Invalid step: {0}", step); } // We never need more than size-1 pad elements var source = Runtime.Append(seq, Take(size - 1, pad)); var v = new Vector(); while (source != null) { while (source != null && v.Count < size) { v.Add(Car(source)); source = Cdr(source); } if (all || v.Count == size) { yield return(AsList(v)); } if (source != null) { if (step < size) { v.RemoveRange(0, step); } else if (size < step) { source = Runtime.Drop(step - size, source); v.Clear(); } else { v.Clear(); } } } }