示例#1
0
            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));
        }