private static void Skip(ref BufferPredicateContext <T, C> context, out Option <List <T> > next)
        {
            context.bd.DetectBacktrack();
            if (context.acc == null)
            {
                var acc = ListPool <T> .Instance.Borrow();

                context.acc = acc;
                context.release.Add(acc);
            }

            while (context.chained.current.isSome && (context.acc.Count == 0 || context.predicate(context.acc[context.acc.Count - 1], context.chained.current.value)))
            {
                context.acc.Add(context.chained.current.value);
                context.chained.skip(ref context.chained.context, out context.chained.current);
            }

            next        = context.acc.Count > 0 ? context.acc.ToOption() : Option <List <T> > .None;
            context.acc = null;

            if (!next.isSome)
            {
                context.release.Slinq().ForEach(ListPool <T> .Instance.Release);
                ListPool <List <T> > .Instance.Release(context.release);

                context.bd.Release();
            }
        }
        private static void Dispose(ref BufferPredicateContext <T, C> context, out Option <List <T> > next)
        {
            next = new Option <List <T> >();

            context.release.Slinq().ForEach(ListPool <T> .Instance.Release);
            ListPool <List <T> > .Instance.Release(context.release);

            context.bd.Release();
        }
 private static void Remove(ref BufferPredicateContext <T, C> context, out Option <List <T> > next)
 {
     throw new NotSupportedException();
 }