Example #1
0
            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();
                        }
                    }
                }
            }