private static IEnumerable <Token> PartitionSequences( IEnumerable <Token> tokens, Func <string, Maybe <Tuple <DescriptorType, Maybe <int> > > > typeLookup) { return(from tseq in tokens.Pairwise( (f, s) => f.IsName() && s.IsValue() ? typeLookup(f.Text).Return(info => info.Item1 == DescriptorType.Sequence ? new[] { f }.Concat(tokens.SkipWhile(t => t.Equals(f)).TakeWhile(v => v.IsValue()).Take(MaybeExtensions.Return(info.Item2, items => items, 0))) : new Token[] { }, new Token[] { }) : new Token[] {}) from t in tseq select t); }