- 367 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 01:31:32.52 ]
- 行数指定時用のコードを書いみたよ。
なんとなく遅延IO使ってみたよ。Iteratee使えるならそっちの方がいいんじゃないかな。 hGetLinesReversed :: Handle -> IO [String] hGetLinesReversed h = hFileSize h >>= lazyLoop h [] where lazyLoop h rest pos = unsafeInterleaveIO $ loop h rest pos loop h rest pos | pos < 0 = return [rest] | otherwise = do hSeek h AbsoluteSeek (max (pos-blockSize) 0) xs <- replicateM (fromInteger (min blockSize pos)) (hGetChar h) let (hd:tl) = lines (xs++rest) (reverse tl ++) <$> lazyLoop h hd (pos - blockSize) blockSize = 128
|

|