TokenPartitions 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)) .Where(t => !scalars.Contains(t)) .Where(t => !sequences.Contains(t)).Memorize(); var values = nonOptions.Where(v => v.IsValue()).Memorize(); var errors = nonOptions.Except(values).Memorize(); return(TokenPartitions.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)); }
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 switches = new HashSet <Token>(Switch.Partition(tokenList, typeLookup), tokenComparer); var scalars = new HashSet <Token>(Scalar.Partition(tokenList, typeLookup), tokenComparer); var sequences = new HashSet <Token>(Sequence.Partition(tokenList, typeLookup), tokenComparer); var nonOptions = tokenList .Where(t => !switches.Contains(t)) .Where(t => !scalars.Contains(t)) .Where(t => !sequences.Contains(t)).Memoize(); var values = nonOptions.Where(v => v.IsValue()).Memoize(); var errors = nonOptions.Except(values, (IEqualityComparer <Token>)ReferenceEqualityComparer.Default).Memoize(); return(Tuple.Create( KeyValuePairHelper.ForSwitch(switches) .Concat(KeyValuePairHelper.ForScalar(scalars)) .Concat(KeyValuePairHelper.ForSequence(sequences)), values.Select(t => t.Text), errors)); }