on bcf8ef4 help sign in
streamly/examples/HandleIO.hs
73 lines 2.4 kB history raw
1import qualified Streamly.Prelude as S
2import qualified Streamly.Data.Fold as FL
3import qualified Streamly.Memory.Array as A
4import qualified Streamly.FileSystem.Handle as FH
5import qualified System.IO as FH
6-- import qualified Streamly.FileSystem.FD as FH
7-- import qualified Streamly.String as SS
9import Data.Char (ord)
10import System.Environment (getArgs)
11import System.IO (IOMode(..), hSeek, SeekMode(..))
13cat :: FH.Handle -> IO ()
14cat src = S.runFold (FH.writeArrays FH.stdout) $ FH.readArraysOf (256*1024) src
15-- byte stream version
16-- cat src = S.runFold (FH.write FH.stdout) $ FH.read src
18cp :: FH.Handle -> FH.Handle -> IO ()
19cp src dst = S.runFold (FH.writeArrays dst) $ FH.readArraysOf (256*1024) src
20-- byte stream version
21-- cp src dst = S.runFold (FH.write dst) $ FH.read src
23ord' :: Num a => Char -> a
24ord' = (fromIntegral . ord)
26wcl :: FH.Handle -> IO ()
27wcl src = print =<< (S.length
28 $ A.splitOn 10
29 $ FH.readArrays src)
30{-
31-- Char stream version
32wcl src = print =<< (S.length
33 $ flip SS.foldLines FL.drain
34 $ SS.decodeChar8
35 $ FH.read src)
36-}
38{-
39grepc :: String -> FH.Handle -> IO ()
40grepc pat src = print . (subtract 1) =<< (S.length
41 $ FL.splitOnSeq (A.fromList (map ord' pat)) FL.drain
42 $ FH.read src)
43-}
45avgll :: FH.Handle -> IO ()
46avgll src = print =<< (S.runFold avg
47 $ S.splitWithSuffix (== ord' '\n') FL.length
48 $ FH.read src)
49 where avg = (/) <$> toDouble FL.sum <*> toDouble FL.length
50 toDouble = fmap (fromIntegral :: Int -> Double)
52llhisto :: FH.Handle -> IO ()
53llhisto src = print =<< (S.runFold (FL.classify FL.length)
54 $ S.map bucket
55 $ S.splitWithSuffix (== ord' '\n') FL.length
56 $ FH.read src)
57 where
58 bucket n = let i = n `div` 10 in if i > 9 then (9,n) else (i,n)
60main :: IO ()
61main = do
62 name <- fmap head getArgs
63 src <- FH.openFile name ReadMode
64 let rewind = hSeek src AbsoluteSeek 0
66 rewind >> putStrLn "cat" >> cat src -- Unix cat program
67 rewind >> putStr "wcl " >> wcl src -- Unix wc -l program
68 -- rewind >> putStr "grepc " >> grepc "aaaa" src -- Unix grep -c program
69 rewind >> putStr "avgll " >> avgll src -- get average line length
70 rewind >> putStr "llhisto " >> llhisto src -- get line length histogram
72 dst <- FH.openFile "dst-xyz.txt" WriteMode
73 rewind >> putStr "cp " >> cp src dst -- Unix cp program