@@ -8,6 +8,13 @@ export function unwrap<T>(val: T | null | undefined): T {
88export function panic ( message : string ) : never {
99 throw new Error ( message ) ;
1010}
11+ export function stairs ( len : number , top : number ) : number [ ] {
12+ const ret : number [ ] = [ ] ;
13+ for ( let i = 0 ; i < len ; i ++ ) {
14+ ret . push ( ( top / len ) * i ) ;
15+ }
16+ return ret ;
17+ }
1118
1219export function groupBy < T , U > ( list : T [ ] , groupFn : ( t : T ) => U ) : { key : U ; val : T [ ] } [ ] {
1320 const map = new Map < U , T [ ] > ( ) ;
@@ -25,34 +32,19 @@ export function groupBy<T, U>(list: T[], groupFn: (t: T) => U): { key: U; val: T
2532 return ret ;
2633}
2734
28- export function groupSteps (
29- current : Date ,
30- list : Visit [ ] ,
31- start : Date ,
32- steps : number
33- ) : [ number , Date ] [ ] {
35+ export function groupByTime ( current : Date , start : Date , list : Date [ ] , steps : number ) : number [ ] {
3436 const currentTime = current . getTime ( ) ;
3537 const totalDuration = currentTime - start . getTime ( ) ;
3638 const stepWidth = totalDuration / steps ;
37- const values = list . map ( ( i ) => currentTime - i . at . getTime ( ) ) ; // all should be pos
38- const result : [ number , Date ] [ ] = groupInSteps ( values , stepWidth ) . map (
39- ( count , index ) => [ count , new Date ( currentTime - index * stepWidth ) ] as const
40- ) ;
41- return result ;
39+ const values = list . map ( ( i ) => currentTime - i . getTime ( ) ) ; // all should be pos
40+ const result : number [ ] = groupInSteps ( values , totalDuration , steps ) ;
41+ return result . reverse ( ) ;
4242}
4343
44- export function stairs ( len : number , top : number ) : number [ ] {
45- const ret : number [ ] = [ ] ;
46- for ( let i = 0 ; i < len ; i ++ ) {
47- ret . push ( ( top / len ) * i ) ;
48- }
49- return ret ;
50- }
51- function groupInSteps ( list : number [ ] , stepWidth : number ) : number [ ] {
52- const maxVal = list . reduce ( ( a , b ) => Math . max ( a , b ) ) ;
53- const steps = Math . ceil ( maxVal / stepWidth ) ;
54- const arr : number [ ] = new Array ( steps + 1 ) . fill ( 0 ) ;
55- for ( const datapoint of list ) {
44+ export function groupInSteps ( input : number [ ] , maxVal : number , length : number ) : number [ ] {
45+ const stepWidth = Math . ceil ( maxVal / length ) ;
46+ const arr : number [ ] = new Array ( length ) . fill ( 0 ) ;
47+ for ( const datapoint of input ) {
5648 const idx = Math . floor ( datapoint / stepWidth ) ;
5749 const val = arr [ idx ] ;
5850 if ( val === undefined )
0 commit comments