@@ -90,60 +90,63 @@ export default class LanguageFeatureRegistry<T> {
9090 }
9191
9292 ordered ( model : IModel ) : T [ ] {
93- let entries = this . _orderedEntries ( model ) ;
94- return entries . map ( item => item . provider ) ;
93+ const result : T [ ] = [ ] ;
94+ this . _orderedForEach ( model , entry => result . push ( entry . provider ) ) ;
95+ return result ;
9596 }
9697
9798 orderedGroups ( model : IModel ) : T [ ] [ ] {
98- let entries = this . _orderedEntries ( model ) ;
99- let result : T [ ] [ ] = [ ] ;
99+ const result : T [ ] [ ] = [ ] ;
100100 let lastBucket : T [ ] ;
101101 let lastBucketScore : number ;
102102
103- for ( let entry of entries ) {
103+ this . _orderedForEach ( model , entry => {
104104 if ( lastBucket && lastBucketScore === entry . _score ) {
105105 lastBucket . push ( entry . provider ) ;
106106 } else {
107107 lastBucketScore = entry . _score ;
108108 lastBucket = [ entry . provider ] ;
109109 result . push ( lastBucket ) ;
110110 }
111- }
111+ } ) ;
112112
113113 return result ;
114114 }
115115
116- private _orderedEntries ( model : IModel ) : Entry < T > [ ] {
116+ private _orderedForEach ( model : IModel , callback : ( provider : Entry < T > ) => any ) : void {
117+
117118 if ( ! model || model . isTooLargeForHavingAMode ( ) ) {
118- return [ ] ;
119+ return ;
119120 }
120- const result : Entry < T > [ ] = [ ] ;
121121
122122 if ( this . _updateScores ( model ) ) {
123123 this . _sortByScore ( ) ;
124124 }
125125
126- // (1) from registry
127- for ( let entry of this . _entries ) {
128- if ( entry . _score > 0 ) {
129- result . push ( entry ) ;
130- }
131- }
126+ let supportIndex : number = - 1 ;
127+ let supportEntry : Entry < T > ;
132128
133- // (2) from mode
134129 if ( model . getMode ( ) && model . getMode ( ) [ this . _supportName ] ) {
135-
136- let entry : Entry < T > = {
130+ supportEntry = {
137131 selector : undefined ,
138132 provider : model . getMode ( ) [ this . _supportName ] ,
139133 _score : .5 ,
140134 _time : 0
141135 } ;
136+ supportIndex = ~ binarySearch ( this . _entries , supportEntry , LanguageFeatureRegistry . _compareByScoreAndTime ) ;
137+ }
142138
143- let idx = binarySearch ( result , entry , LanguageFeatureRegistry . _compareByScoreAndTime ) ;
144- result . splice ( idx < 0 ? ~ idx : idx , 0 , entry ) ;
139+ const to = Math . max ( supportIndex + 1 , this . _entries . length ) ;
140+ for ( let from = 0 ; from < to ; from ++ ) {
141+ if ( from === supportIndex ) {
142+ callback ( supportEntry ) ;
143+ } else {
144+ let entry = this . _entries [ from ] ;
145+ if ( entry . _score > 0 ) {
146+ callback ( entry ) ;
147+ }
148+ }
145149 }
146- return result ;
147150 }
148151
149152 private _lastCandidate : { uri : string ; language : string ; } ;
0 commit comments