Advertisement
anacrolix

github language popularity concurrently

Dec 20th, 2011
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package main
  2.  
  3. import (
  4.     "http"
  5.     "io/ioutil"
  6.     "regexp"
  7.     "url"
  8.     "strconv"
  9. )
  10.  
  11. var langre = regexp.MustCompile("/languages/([^/\"]+)")
  12.  
  13. func languages() (langs []string) {
  14.     resp, err := http.Get("http://github.com/languages")
  15.     if err != nil {
  16.         panic(err)
  17.     }
  18.     body, err := ioutil.ReadAll(resp.Body)
  19.     if err != nil {
  20.         panic(err)
  21.     }
  22.     seen := make(map[string]bool)
  23.     for _, subm := range langre.FindAllStringSubmatch(string(body), -1) {
  24.         unlang, err := url.QueryUnescape(subm[1])
  25.         if err != nil { panic(err) }
  26.         if !seen[unlang] {
  27.             seen[unlang] = true
  28.             langs = append(langs, subm[1])
  29.         }
  30.     }
  31.     return
  32. }
  33.  
  34. var rankre = regexp.MustCompile("is the #([0-9]+)")
  35. var mostpop = regexp.MustCompile("is <strong>the most")
  36.  
  37. func popularity(lang string) int {
  38.     url := "http://github.com/languages/" + lang
  39.     //~ println(url)
  40.     resp, err := http.Get(url)
  41.     if err != nil {panic(err)}
  42.     body, err := ioutil.ReadAll(resp.Body)
  43.     if err != nil {
  44.         panic(err)
  45.     }
  46.     subm := rankre.FindSubmatch(body)
  47.     if subm == nil {
  48.         if mostpop.Find(body) != nil {
  49.             return 1
  50.         }
  51.         return 0
  52.     }
  53.     rank, err := strconv.Atoi(string(subm[1]))
  54.     if err != nil {panic(err)}
  55.     return rank
  56. }
  57.  
  58. type langpop struct { Lang string; Rank int }
  59.  
  60. func main() {
  61.     rankch := make(chan langpop)
  62.     nlangs := 0
  63.     for _, lang := range languages() {
  64.         go func(lang string) {
  65.             rankch<-langpop{lang, popularity(lang)}
  66.         }(lang)
  67.         nlangs++
  68.     }
  69.     ranks := make(map[int]string)
  70.     for r := 1; ; r++ {
  71.         for {
  72.             if _, ok := ranks[r]; ok {
  73.                 break
  74.             } else if nlangs == 0 {
  75.                 return
  76.             }
  77.             lp := <-rankch
  78.             //~ println(lp.Rank, lp.Lang)
  79.             ranks[lp.Rank] = lp.Lang
  80.             nlangs--
  81.         }
  82.         plang, err := url.QueryUnescape(ranks[r])
  83.         if err != nil {
  84.             panic(err)
  85.         }
  86.         println(r, plang)
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement