public static Parser <TToken, IDelayed <ISeq <T> > > Many0 <TToken, T>(
     Parser <TToken, T> parser)
 {
     return(stream => parser(stream).Case(
                failure: (restStream, errorMessage) =>
                Reply.Success <TToken, IDelayed <ISeq <T> > >(stream, Seq.Empty <T>()),
                success: (restStream, head) =>
                InternalCombinator.Many0(parser).Select(tail => Seq.Cons(head, tail))(restStream)));
 }
 public static Parser <TToken, IDelayed <ISeq <T> > > EndBy0 <TToken, T>(
     Parser <TToken, T> parser,
     Parser <TToken, Unit> sep)
 {
     return(InternalCombinator.Many0(parser.SelectMany(value => sep.Select(_ => value))));
 }
 public static Parser <TToken, IDelayed <ISeq <T> > > SepBy1 <TToken, T>(
     Parser <TToken, T> parser,
     Parser <TToken, Unit> sep)
 {
     return(parser.SelectMany(head => InternalCombinator.Many0(sep.SelectMany(_ => parser)).Select(tail => Seq.Cons(head, tail))));
 }
 public static Parser <TToken, IDelayed <ISeq <T> > > Many1 <TToken, T>(
     Parser <TToken, T> parser)
 {
     return(parser.SelectMany(head => InternalCombinator.Many0(parser).Select(tail => Seq.Cons(head, tail))));
 }