Created
June 20, 2017 03:54
-
-
Save igrep/8a1c2cde03de4ac0d9e7dc18b52e5051 to your computer and use it in GitHub Desktop.
Haskell scriptingたのしー!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/env stack | |
| {- stack --resolver=lts-8.19 | |
| runghc | |
| --package=attoparsec | |
| --package=bytestring | |
| --package=unordered-containers | |
| --package=filepath | |
| -} | |
| {- | |
| duコマンドが出力した下記のような形式のファイルから、拡張子別のファイルサイズの合計を計算する | |
| 12345 /path/to/file.txt | |
| 123 /path/to/another/file.jar | |
| ... | |
| -} | |
| {-# LANGUAGE OverloadedStrings #-} | |
| import qualified Control.Arrow as A | |
| import Control.Arrow ((>>>)) | |
| import qualified Data.Attoparsec.ByteString.Char8 as ABS | |
| import qualified Data.Attoparsec.ByteString.Lazy as ABSL | |
| import qualified Data.ByteString.Char8 as BS | |
| import qualified Data.ByteString.Lazy.Char8 as BSL | |
| import Data.Either (partitionEithers) | |
| import Data.Function ((&)) | |
| import qualified Data.HashMap.Strict as M | |
| import Data.List (sortBy) | |
| import Data.Ord (comparing) | |
| import System.FilePath (takeExtension) | |
| type Size = Int | |
| type Extension = String | |
| parser :: ABS.Parser (Extension, Size) | |
| parser = | |
| flip (,) | |
| <$> ABS.decimal | |
| <*> (takeExtension . BS.unpack <$> ABSL.takeByteString) | |
| main :: IO () | |
| main = do | |
| contents <- BSL.getContents | |
| let (errs, result) = | |
| BSL.lines contents -- 各行を | |
| & map (ABSL.eitherResult . ABSL.parse parser) -- 拡張子とファイルサイズに分けて | |
| & partitionEithers -- エラーと正常な結果に分けて | |
| & A.second -- 正常な結果から | |
| ( M.fromListWith (+) -- 拡張子毎のファイルサイズの合計を計算し | |
| >>> M.toList | |
| >>> sortBy (comparing snd) -- ファイルサイズ順に並び替える | |
| ) | |
| putStrLn $ "Errors: " ++ show errs | |
| mapM_ print result |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
特筆すべき点はありませんが今仕事の野暮用で書いていて楽しかったので。