on master help sign in
Add file-io example
commit25dacda03ba9409915c667e5d8608f403e1bdf09 authorHarendra Kumar <harendra.kumar@gmail.com> dateWed 22 May 2019, 07:08 (7 years ago) parent9178cf0
2 files changed+70
examples/FileIO.hs+57 streamly.cabal+13
examples/FileIO.hsnew file+57
@@ -0,0 +1,57 @@
1+import qualified Streamly.Prelude as S
2+import qualified Streamly.Fold as FL
3+import qualified Streamly.Mem.Array as A
4+import qualified Streamly.FileSystem.File as File
5+
6+import Data.Char (ord)
7+import System.Environment (getArgs)
8+import System.IO (openFile, IOMode(..), stdout, Handle, hSeek, SeekMode(..))
9+
10+cat :: Handle -> IO ()
11+cat src = File.writeArrays stdout $ File.readArraysUpto (256*1024) src
12+
13+cp :: Handle -> Handle -> IO ()
14+cp src dst = File.writeArrays dst $ File.readArraysUpto (256*1024) src
15+
16+ord' :: Num a => Char -> a
17+ord' = (fromIntegral . ord)
18+
19+wcl :: Handle -> IO ()
20+wcl src = print =<< (S.length
21+ $ FL.splitSuffixBy (== ord' '\n') FL.drain
22+ $ File.read src)
23+
24+grepc :: String -> Handle -> IO ()
25+grepc pat src = print . (subtract 1) =<< (S.length
26+ $ FL.splitOn (A.fromList (map ord' pat)) FL.drain
27+ $ File.read src)
28+
29+avgll :: Handle -> IO ()
30+avgll 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)
35+
36+llhisto :: Handle -> IO ()
37+llhisto 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)
43+
44+main :: IO ()
45+main = do
46+ name <- fmap head getArgs
47+ src <- openFile name ReadMode
48+ let rewind = hSeek src AbsoluteSeek 0
49+
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
55+
56+ dst <- openFile "dst-xyz.txt" WriteMode
57+ rewind >> putStr "cp " >> cp src dst -- Unix cp program
streamly.cabal+13
@@ -927,3 +927,16 @@ executable ControlFlow
927927 semigroups >= 0.18 && < 0.19
928928 else
929929 buildable: False
930+
931+executable FileIO
932+ default-language: Haskell2010
933+ main-is: FileIO.hs
934+ hs-source-dirs: examples
935+ ghc-options: -Wall
936+ if flag(examples) || flag(examples-sdl)
937+ buildable: True
938+ build-Depends:
939+ streamly
940+ , base >= 4.8 && < 5
941+ else
942+ buildable: False