on 07f6c8a help sign in
streamly/examples/FileIO.hs
57 lines 2.0 kB history raw
1import qualified Streamly.Prelude as S
2import qualified Streamly.Fold as FL
3import qualified Streamly.Mem.Array as A
4import qualified Streamly.FileSystem.File as File
6import Data.Char (ord)
7import System.Environment (getArgs)
8import System.IO (openFile, IOMode(..), stdout, Handle, hSeek, SeekMode(..))
10cat :: Handle -> IO ()
11cat src = File.writeArrays stdout $ File.readArraysUpto (256*1024) src
13cp :: Handle -> Handle -> IO ()
14cp src dst = File.writeArrays dst $ File.readArraysUpto (256*1024) src
16ord' :: Num a => Char -> a
17ord' = (fromIntegral . ord)
19wcl :: Handle -> IO ()
20wcl src = print =<< (S.length
21 $ FL.splitSuffixBy (== ord' '\n') FL.drain
22 $ File.read src)
24grepc :: String -> Handle -> IO ()
25grepc pat src = print . (subtract 1) =<< (S.length
26 $ FL.splitOn (A.fromList (map ord' pat)) FL.drain
27 $ File.read src)
29avgll :: Handle -> IO ()
30avgll src = print =<< (FL.foldl' avg
31 $ FL.splitSuffixBy (== ord' '\n') FL.length
32 $ File.read src)
33 where avg = (/) <$> toDouble FL.sum <*> toDouble FL.length
34 toDouble = fmap (fromIntegral :: Int -> Double)
36llhisto :: Handle -> IO ()
37llhisto src = print =<< (FL.foldl' (FL.classify FL.length)
38 $ S.map bucket
39 $ FL.splitSuffixBy (== ord' '\n') FL.length
40 $ File.read src)
41 where
42 bucket n = let i = n `div` 10 in if i > 9 then (9,n) else (i,n)
44main :: IO ()
45main = do
46 name <- fmap head getArgs
47 src <- openFile name ReadMode
48 let rewind = hSeek src AbsoluteSeek 0
50 rewind >> putStrLn "cat" >> cat src -- Unix cat program
51 rewind >> putStr "wcl " >> wcl src -- Unix wc -l program
52 rewind >> putStr "grepc " >> grepc "aaaa" src -- Unix grep -c program
53 rewind >> putStr "avgll " >> avgll src -- get average line length
54 rewind >> putStr "llhisto " >> llhisto src -- get line length histogram
56 dst <- openFile "dst-xyz.txt" WriteMode
57 rewind >> putStr "cp " >> cp src dst -- Unix cp program