処理進行中を表すプロペラを回転させるプログラムを作ってみました

shtool - メモ帳のpropコマンドのところを読んで、関数cycleが使えるかなと思って試しに作ってみました。
ファイル: prop.hs

module Main (main) where

import System (getArgs, getProgName)
import System.IO (hPutStr, stderr)
import Text.Printf (printf)

prop :: String -> [String] -> [String]
prop prefix ls = (cnt ls) ++ [end]
  where
    cnt :: [String] -> [String]
    cnt = zipWith (\ c _ -> printf "\r%s...%c\b" prefix c) $ cycle "|/-\\"

    end :: String
    end = printf "\r%s    \n" prefix

main :: IO ()
main = do
  prefix <- getPrefix
  mapM_ (hPutStr stderr) . prop prefix . lines =<< getContents
  where
    getPrefix :: IO String
    getPrefix = do
      args <- getArgs
      case args of
        (x : _ ) -> return x
        []       -> getProgName

実行例:

$ for i in {1..5}; do echo;sleep 1;done | ./prop Running

参照: OSSP: GNU shtool