@@ -14,30 +14,141 @@ public static IEnumerable<Token> Partition(
1414 IEnumerable < Token > tokens ,
1515 Func < string , Maybe < TypeDescriptor > > typeLookup )
1616 {
17- return from tseq in tokens . Pairwise (
18- ( f , s ) =>
19- f . IsName ( ) && s . IsValue ( )
20- ? typeLookup ( f . Text ) . MapValueOrDefault ( info =>
21- info . TargetType == TargetType . Sequence
22- ? new [ ] { f } . Concat ( tokens . OfSequence ( f , info ) )
23- : new Token [ ] { } , new Token [ ] { } )
24- : new Token [ ] { } )
25- from t in tseq
26- select t ;
27- }
17+ var sequences = new Dictionary < Token , IList < Token > > ( ) ;
18+ var state = SequenceState . TokenSearch ;
19+ Token nameToken = default ;
20+ foreach ( var token in tokens )
21+ {
22+ switch ( state )
23+ {
24+ case SequenceState . TokenSearch :
25+ if ( token . IsName ( ) )
26+ {
27+ if ( typeLookup ( token . Text ) . MatchJust ( out var info ) && info . TargetType == TargetType . Sequence )
28+ {
29+ nameToken = token ;
30+ state = SequenceState . TokenFound ;
31+ }
32+ }
33+ break ;
2834
29- private static IEnumerable < Token > OfSequence ( this IEnumerable < Token > tokens , Token nameToken , TypeDescriptor info )
30- {
31- var nameIndex = tokens . IndexOf ( t => t . Equals ( nameToken ) ) ;
32- if ( nameIndex >= 0 )
35+ case SequenceState . TokenFound :
36+ if ( token . IsValue ( ) )
37+ {
38+ if ( sequences . TryGetValue ( nameToken , out var sequence ) )
39+ {
40+ sequence . Add ( token ) ;
41+ }
42+ else
43+ {
44+ sequences [ nameToken ] = new List < Token > ( new [ ] { token } ) ;
45+ }
46+ }
47+ else if ( token . IsName ( ) )
48+ {
49+ if ( typeLookup ( token . Text ) . MatchJust ( out var info ) && info . TargetType == TargetType . Sequence )
50+ {
51+ nameToken = token ;
52+ state = SequenceState . TokenFound ;
53+ }
54+ else
55+ {
56+ state = SequenceState . TokenSearch ;
57+ }
58+ }
59+ else
60+ {
61+ state = SequenceState . TokenSearch ;
62+ }
63+ break ;
64+ }
65+ }
66+
67+ foreach ( var kvp in sequences )
3368 {
34- return info . NextValue . MapValueOrDefault (
35- _ => info . MaxItems . MapValueOrDefault (
36- n => tokens . Skip ( nameIndex + 1 ) . Take ( n ) ,
37- tokens . Skip ( nameIndex + 1 ) . TakeWhile ( v => v . IsValue ( ) ) ) ,
38- tokens . Skip ( nameIndex + 1 ) . TakeWhile ( v => v . IsValue ( ) ) ) ;
69+ yield return kvp . Key ;
70+ foreach ( var value in kvp . Value )
71+ {
72+ yield return value ;
73+ }
3974 }
40- return new Token [ ] { } ;
75+
76+ //return from tseq in tokens.Pairwise(
77+ //(f, s) =>
78+ // f.IsName() && s.IsValue()
79+ // ? typeLookup(f.Text).MapValueOrDefault(info =>
80+ // info.TargetType == TargetType.Sequence
81+ // ? new[] { f }.Concat(tokens.OfSequence(f, info))
82+ // : new Token[] { }, new Token[] { })
83+ // : new Token[] { })
84+ // from t in tseq
85+ // select t;
86+ }
87+
88+ //private static IEnumerable<Token> OfSequence(this IEnumerable<Token> tokens, Token nameToken, TypeDescriptor info)
89+ //{
90+ // var state = SequenceState.TokenSearch;
91+ // var count = 0;
92+ // var max = info.MaxItems.GetValueOrDefault(int.MaxValue);
93+ // var values = max != int.MaxValue
94+ // ? new List<Token>(max)
95+ // : new List<Token>();
96+
97+ // foreach (var token in tokens)
98+ // {
99+ // if (count == max)
100+ // {
101+ // break;
102+ // }
103+
104+ // switch (state)
105+ // {
106+ // case SequenceState.TokenSearch:
107+ // if (token.IsName() && token.Text.Equals(nameToken.Text))
108+ // {
109+ // state = SequenceState.TokenFound;
110+ // }
111+ // break;
112+
113+ // case SequenceState.TokenFound:
114+ // if (token.IsValue())
115+ // {
116+ // state = SequenceState.ValueFound;
117+ // count++;
118+ // values.Add(token);
119+ // }
120+ // else
121+ // {
122+ // // Invalid to provide option without value
123+ // return Enumerable.Empty<Token>();
124+ // }
125+ // break;
126+
127+ // case SequenceState.ValueFound:
128+ // if (token.IsValue())
129+ // {
130+ // count++;
131+ // values.Add(token);
132+ // }
133+ // else if (token.IsName() && token.Text.Equals(nameToken.Text))
134+ // {
135+ // state = SequenceState.TokenFound;
136+ // }
137+ // else
138+ // {
139+ // state = SequenceState.TokenSearch;
140+ // }
141+ // break;
142+ // }
143+ // }
144+
145+ // return values;
146+ //}
147+
148+ private enum SequenceState
149+ {
150+ TokenSearch ,
151+ TokenFound ,
41152 }
42153 }
43154}
0 commit comments