bouzuya.hatenablog.com

ぼうずやのにっき

PureScript ではどのパッケージが人気なのだろう

PureScript ではどのパッケージが人気なのだろう。調べてみたくなった。

ここでは多くのパッケージから依存されているものを「人気パッケージ」と考えることにし、現時点で最新のパッケージセットである purescript/package-sets の psc-0.12.0-20180803 を対象に調べた。

調べ方は素朴に jq で。 justinwoo/spacchetti が jq で reverse dependencies をとっていたので、それを参考にした。

https://github.com/justinwoo/spacchetti/blob/d307242e7cb9eb7dc1569ed900f4606d59a525b8/scripts/verify.pl#L50

my @reverseDeps = `cat packages.json | jq 'to_entries[] | select(.value.dependencies[] | contains("$name")) | .key'`;

参考にしたけど、相当改変した。あと contains("$name") だと部分一致になるのはバグっぽかったので、修正する Pull Request を投げた (justinwoo/spacchetti#15) 。

で、↓が調べるためのスクリプト。とりあえず上限 10 (| limit(10; .[])) にしている。

git clone https://github.com/purescript/package-sets
cd package-sets
git checkout psc-0.12.0-20180803
cat packages.json | jq '
  [
    to_entries as $entries
    | $entries
    | .[]
    | .["key"] as $name
    | { "name": $name
      , "count": (
          [ $entries
            | .[]
            | select(.["value"] | .["dependencies"] | .[] | . == $name)
            | .key
          ]
          | length
        )
      }
  ]
  | sort_by(.["count"])
  | reverse
  | limit(10; .[])
  '

結果 (TOP 10) は↓のとおり。

{
  "name": "prelude",
  "count": 88
}
{
  "name": "maybe",
  "count": 54
}
{
  "name": "effect",
  "count": 37
}
{
  "name": "foldable-traversable",
  "count": 35
}
{
  "name": "either",
  "count": 35
}
{
  "name": "tuples",
  "count": 31
}
{
  "name": "newtype",
  "count": 29
}
{
  "name": "control",
  "count": 27
}
{
  "name": "lists",
  "count": 23
}
{
  "name": "strings",
  "count": 21
}

当然のように prelude が一位。ただ全部で 160 パッケージあるのに、依存していないものもあるのは気になる。使っていないのか、それとも dependencies に書かなくても動くのか。とりあえず上位は本当によく見るパッケージなので、特に思うところはない。