on e7d2a73 help sign in
streamly/examples/HandleIO.hs
79 lines 2.6 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.Data.Unicode.Stream as US
11import Data.Char (ord)
12import System.Environment (getArgs)
13import System.IO (IOMode(..), hSeek, SeekMode(..))
15cat :: FH.Handle -> IO ()
16cat src =
17 S.fold (FH.writeChunks FH.stdout)
18 $ IFH.toChunksWithBufferOf (256*1024) src
19-- byte stream version
20-- cat src = S.fold (FH.write FH.stdout) $ FH.read src
22cp :: FH.Handle -> FH.Handle -> IO ()
23cp src dst =
24 S.fold (FH.writeChunks dst)
25 $ IFH.toChunksWithBufferOf (256*1024) src
26-- byte stream version
27-- cp src dst = S.fold (FH.write dst) $ FH.read src
29ord' :: Num a => Char -> a
30ord' = (fromIntegral . ord)
32wcl :: FH.Handle -> IO ()
33wcl src = print =<< (S.length
34 $ AS.splitOn 10
35 $ IFH.toChunks src)
36{-
37-- Char stream version
38wcl src = print =<< (S.length
39 $ flip US.lines FL.drain
40 $ US.decodeLatin1
41 $ FH.read src)
42-}
44{-
45grepc :: String -> FH.Handle -> IO ()
46grepc pat src = print . (subtract 1) =<< (S.length
47 $ FL.splitOnSeq (A.fromList (map ord' pat)) FL.drain
48 $ FH.read src)
49-}
51avgll :: FH.Handle -> IO ()
52avgll src = print =<< (S.fold avg
53 $ S.splitWithSuffix (== ord' '\n') FL.length
54 $ S.unfold FH.read src)
55 where avg = (/) <$> toDouble FL.sum <*> toDouble FL.length
56 toDouble = fmap (fromIntegral :: Int -> Double)
58llhisto :: FH.Handle -> IO ()
59llhisto src = print =<< (S.fold (FL.classify FL.length)
60 $ S.map bucket
61 $ S.splitWithSuffix (== ord' '\n') FL.length
62 $ S.unfold FH.read src)
63 where
64 bucket n = let i = n `div` 10 in if i > 9 then (9,n) else (i,n)
66main :: IO ()
67main = do
68 name <- fmap head getArgs
69 src <- FH.openFile name ReadMode
70 let rewind = hSeek src AbsoluteSeek 0
72 rewind >> putStrLn "cat" >> cat src -- Unix cat program
73 rewind >> putStr "wcl " >> wcl src -- Unix wc -l program
74 -- rewind >> putStr "grepc " >> grepc "aaaa" src -- Unix grep -c program
75 rewind >> putStr "avgll " >> avgll src -- get average line length
76 rewind >> putStr "llhisto " >> llhisto src -- get line length histogram
78 dst <- FH.openFile "dst-xyz.txt" WriteMode
79 rewind >> putStr "cp " >> cp src dst -- Unix cp program