packages feed

simple-pipe-0.0.0.0: examples/upperFile.hs

{-# LANGUAGE PackageImports #-}

import Data.Pipe
import Data.Char
import System.IO
import "monads-tf" Control.Monad.Trans

main :: IO ()
main = do
	_ <- runPipe $
		readFileP "sample.txt"
			=$= takeP 3
			=$= convert (map toUpper)
			=$= writeString
	return ()

readFileP :: FilePath -> Pipe () String IO ()
readFileP fp = bracket (openFile fp ReadMode) hClose hRead

hRead :: Handle -> Pipe () String IO ()
hRead h = do
	eof <- lift $ hIsEOF h
	if eof then return () else do
		l <- lift $ hGetLine h
		yield l
		hRead h

writeString :: Pipe String () IO ()
writeString = do
	ms <- await
	case ms of
		Just s -> lift (putStrLn s) >> writeString
		_ -> return ()

convert :: Monad m => (a -> b) -> Pipe a b m ()
convert f = do
	mx <- await
	case mx of
		Just x -> yield (f x) >> convert f
		_ -> return ()

takeP :: Monad m => Int -> Pipe a a m ()
takeP 0 = return ()
takeP n = do
	mx <- await
	case mx of
		Just x -> yield x >> takeP (n - 1)
		_ -> return ()