@@ -474,54 +474,100 @@ pub fn try_fold_packages(
474474
475475fn try_fold_releases (
476476 database : Database ,
477+ package : String ,
477478 initial : acc,
478479 folder : fn ( acc, Release ) -> Result ( acc, Error ) ,
479480) -> Result ( acc, Error ) {
480- try_fold_packages ( database , initial , fn ( acc , package ) {
481- use releases <- result . try ( list_releases ( database , package . name ) )
482- list . try_fold ( releases , acc , fn ( acc , version ) {
483- use release <- result . try ( get_release ( database , package . name , version ) )
484- folder ( acc , release )
485- } )
481+ use releases <- result . try ( list_releases ( database , package ) )
482+ list . try_fold ( releases , initial , fn ( acc , version ) {
483+ use release <- result . try ( get_release ( database , package , version ) )
484+ folder ( acc , release )
486485 } )
487486}
488487
489- pub fn new_package_count_per_day (
490- database : Database ,
491- ) -> Result ( List ( # ( String , Int ) ) , Error ) {
492- use packages <- result . try (
493- try_fold_packages ( database , dict . new ( ) , fn ( counts , package ) {
494- package . inserted_in_hex_at
495- |> date_string
496- |> dict . upsert ( counts , _, fn ( c ) { option . unwrap ( c , 0 ) + 1 } )
497- |> Ok
488+ pub type InternetPoints {
489+ InternetPoints (
490+ package_counts : List ( # ( String , Int ) ) ,
491+ release_counts : List ( # ( String , Int ) ) ,
492+ owner_download_counts : List ( # ( String , Int ) ) ,
493+ owner_package_counts : List ( # ( String , Int ) ) ,
494+ )
495+ }
496+
497+ type InternetPointsAcc {
498+ InternetPointsAcc (
499+ package_counts : dict . Dict ( String , Int ) ,
500+ release_counts : dict . Dict ( String , Int ) ,
501+ owner_download_counts : dict . Dict ( String , Int ) ,
502+ owner_package_counts : dict . Dict ( String , Int ) ,
503+ )
504+ }
505+
506+ pub fn internet_points ( database : Database ) -> Result ( InternetPoints , Error ) {
507+ let acc = InternetPointsAcc ( dict . new ( ) , dict . new ( ) , dict . new ( ) , dict . new ( ) )
508+
509+ use acc <- result . try (
510+ try_fold_packages ( database , acc , fn ( acc , package ) {
511+ let count_for_owners = fn ( counts , amount ) {
512+ list . fold ( package . owners , counts , fn ( counts , owner ) {
513+ dict . upsert ( counts , owner , fn ( c ) { option . unwrap ( c , 0 ) + amount } )
514+ } )
515+ }
516+ let count_for_dates = fn ( counts , date ) {
517+ date
518+ |> date_string
519+ |> dict . upsert ( counts , _, fn ( c ) { option . unwrap ( c , 0 ) + 1 } )
520+ }
521+
522+ let owner_package_counts = count_for_owners ( acc . owner_package_counts , 1 )
523+ let owner_download_counts =
524+ count_for_owners ( acc . owner_download_counts , package . downloads_all )
525+ let package_counts =
526+ count_for_dates ( acc . package_counts , package . inserted_in_hex_at )
527+
528+ use release_counts <- result . try (
529+ try_fold_releases (
530+ database ,
531+ package . name ,
532+ acc . release_counts ,
533+ fn ( counts , release ) {
534+ release . inserted_in_hex_at
535+ |> date_string
536+ |> dict . upsert ( counts , _, fn ( c ) { option . unwrap ( c , 0 ) + 1 } )
537+ |> Ok
538+ } ,
539+ ) ,
540+ )
541+
542+ let acc =
543+ InternetPointsAcc (
544+ release_counts : ,
545+ package_counts : ,
546+ owner_download_counts : ,
547+ owner_package_counts : ,
548+ )
549+ Ok ( acc )
498550 } ) ,
499551 )
500- packages
501- |> dict . to_list
502- |> list . sort ( fn ( a , b ) { int . compare ( a . 1 , b . 1 ) } )
503- |> Ok
552+
553+ Ok ( InternetPoints (
554+ package_counts : acc . package_counts
555+ |> dict . to_list
556+ |> list . sort ( fn ( a , b ) { string . compare ( a . 0 , b . 0 ) } ) ,
557+ release_counts : acc . package_counts
558+ |> dict . to_list
559+ |> list . sort ( fn ( a , b ) { string . compare ( a . 0 , b . 0 ) } ) ,
560+ owner_download_counts : acc . owner_download_counts
561+ |> dict . to_list
562+ |> list . sort ( fn ( a , b ) { int . compare ( b . 1 , a . 1 ) } ) ,
563+ owner_package_counts : acc . owner_package_counts
564+ |> dict . to_list
565+ |> list . sort ( fn ( a , b ) { int . compare ( b . 1 , a . 1 ) } ) ,
566+ ) )
504567}
505568
506569fn date_string ( timestamp : Timestamp ) -> String {
507570 timestamp
508571 |> timestamp . to_rfc3339 ( calendar . utc_offset )
509572 |> string . slice ( 0 , 10 )
510573}
511-
512- pub fn new_release_count_per_day (
513- database : Database ,
514- ) -> Result ( List ( # ( String , Int ) ) , Error ) {
515- use releases <- result . try (
516- try_fold_releases ( database , dict . new ( ) , fn ( counts , release ) {
517- release . inserted_in_hex_at
518- |> date_string
519- |> dict . upsert ( counts , _, fn ( c ) { option . unwrap ( c , 0 ) + 1 } )
520- |> Ok
521- } ) ,
522- )
523- releases
524- |> dict . to_list
525- |> list . sort ( fn ( a , b ) { int . compare ( a . 1 , b . 1 ) } )
526- |> Ok
527- }
0 commit comments