@@ -122,6 +122,8 @@ suite("hatStats", () => {
122122 ( _ , index ) => index % Math . floor ( allTokens . length / 16 ) === 0 ,
123123 ) ;
124124
125+ let tokenSpark : string = "" ;
126+
125127 someTokens . forEach ( ( token , index ) => {
126128 editor . primarySelection = new Selection (
127129 token . token . range . start ,
@@ -139,6 +141,7 @@ suite("hatStats", () => {
139141
140142 if ( index === 0 ) {
141143 const golden = goldenHatFile ( contents , allTokens , tokenHat ) ;
144+ tokenSpark = makeTokenSpark ( allTokens , tokenHat ) ;
142145 const goldenPath = filepath + ".golden" ;
143146 if ( shouldUpdateFixtures ( ) ) {
144147 fs . writeFileSync ( goldenPath , golden ) ;
@@ -166,6 +169,11 @@ suite("hatStats", () => {
166169
167170 let s = "" ;
168171 s += `nTokens: ${ allTokens . length } \n\n` ;
172+ s += `tokenSpark:\n` ;
173+ for ( let i = 0 ; i < tokenSpark . length ; i += 60 ) {
174+ s += "\t" + tokenSpark . slice ( i , i + 60 ) + "\n" ;
175+ }
176+ s += "\n" ;
169177 s += describeDistribution ( "nHats" , nHats ) + "\n" ;
170178 s += describeDistribution ( "nPenalty0" , nPenalty0 ) + "\n" ;
171179 s += describeDistribution ( "nPenalty1" , nPenalty1 ) + "\n" ;
@@ -246,6 +254,27 @@ function sparkline(pcts: number[]) {
246254 ) ;
247255}
248256
257+ function makeTokenSpark (
258+ allTokens : RankedToken [ ] ,
259+ tokenHats : TokenHat [ ] ,
260+ ) : string {
261+ const bars = [ "▁" , "▃" , "▅" , "█" ] ;
262+ const penalties = allTokens . map ( ( token ) => {
263+ const hat = tokenHats . find ( ( hat ) =>
264+ hat . token . range . isEqual ( token . token . range ) ,
265+ ) as TokenHat ;
266+ if ( hat === undefined ) {
267+ return 3 ;
268+ }
269+ const hatStyle = hat . hatStyle ;
270+ return penaltyForHatStyle ( hatStyle ) ;
271+ } ) ;
272+ const chars = penalties . map ( ( penalty ) => {
273+ return bars [ penalty ] ;
274+ } ) ;
275+ return chars . join ( "" ) ;
276+ }
277+
249278function goldenHatFile (
250279 contents : string ,
251280 allTokens : RankedToken [ ] ,
0 commit comments