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