ファイルを行数別に分類してカウントしてみる

30分プログラム、その636。ファイルを行数別に分類してカウントしてみる。
コードを書いてると、基本的に各ファイルの行数はばらばらになります。
というわけで、実際に、どれくらいばらけてるかを調べるために、行数ごとに分類してカウントするプログラムを書いてみました。

使い方

$ wcs *(.)
0-10:   23
10-50:  119
50-100: 15
100-:   158

ソースコード

import System
import Control.Arrow
countLine :: FilePath -> IO Int
countLine path = do content <- readFile path
                    return $ length $ lines content

countFor :: Arrow a => (b -> Bool) -> b -> a Int Int
countFor p x = arr $ \n -> if p x then n + 1 else n

between a b n = if a <= n && n < b then True else False

statics x = countFor (< 10)  x ***
            countFor (10 `between` 50) x ***
            countFor (50 `between` 100) x ***
            countFor (100>=) x

wcs paths = do xs <- mapM countLine paths
               return $ foldl (flip statics) (0,(0,(0,0))) xs

main = do args  <- getArgs
          (a,(b,(c,d))) <-  wcs args
          putStrLn $ "0-10:   " ++ show a
          putStrLn $ "10-50:  " ++ show b
          putStrLn $ "50-100: " ++ show c
          putStrLn $ "100-:   " ++ show d