IEnumerable <Token> // errors > Partition( IEnumerable <Token> tokens, Func <string, Maybe <TypeDescriptor> > typeLookup) { var tokenList = tokens.Memorize(); var switches = Switch.Partition(tokenList, typeLookup).Memorize(); var scalars = Scalar.Partition(tokenList, typeLookup).Memorize(); var sequences = Sequence.Partition(tokenList, typeLookup).Memorize(); var nonOptions = tokenList .Where(t => !switches.Contains(t, ReferenceEqualityComparer.Default)) .Where(t => !scalars.Contains(t, ReferenceEqualityComparer.Default)) .Where(t => !sequences.Contains(t, ReferenceEqualityComparer.Default)).Memorize(); var values = nonOptions.Where(v => v.IsValue()).Memorize(); var errors = nonOptions.Except(values, (IEqualityComparer <Token>)ReferenceEqualityComparer.Default).Memorize(); return(Tuple.Create( KeyValuePairHelper.ForSwitch(switches) .Concat(KeyValuePairHelper.ForScalar(scalars)) .Concat(KeyValuePairHelper.ForSequence(sequences)), values.Select(t => t.Text), errors)); }
Tuple <IEnumerable <KeyValuePair <string, IEnumerable <string> > >, IEnumerable <string>, IEnumerable <Token> > Partition( IEnumerable <Token> tokens, Func <string, Maybe <TypeDescriptor> > typeLookup) { IEqualityComparer <Token> tokenComparer = ReferenceEqualityComparer.Default; var tokenList = tokens.Memoize(); var partitioned = PartitionTokensByType(tokenList, typeLookup); var switches = partitioned.Item1; var scalars = partitioned.Item2; var sequences = partitioned.Item3; var nonOptions = partitioned.Item4; var valuesAndErrors = nonOptions.PartitionByPredicate(v => v.IsValue()); var values = valuesAndErrors.Item1; var errors = valuesAndErrors.Item2; return(Tuple.Create( KeyValuePairHelper.ForSwitch(switches) .Concat(KeyValuePairHelper.ForScalar(scalars)) .Concat(KeyValuePairHelper.ForSequence(sequences)), values.Select(t => t.Text), errors)); }