Streaming read
This commit is contained in:
		
							
								
								
									
										25
									
								
								src/Control/Addressbook/Streaming.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/Control/Addressbook/Streaming.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
module Control.Addressbook.Streaming where
 | 
			
		||||
 | 
			
		||||
import qualified Data.Text as T
 | 
			
		||||
 | 
			
		||||
import Conduit
 | 
			
		||||
import qualified Data.Conduit.Binary as CB
 | 
			
		||||
import qualified Data.Conduit.Combinators as C
 | 
			
		||||
import qualified Data.Conduit.List as CL
 | 
			
		||||
import qualified Data.Conduit.Text as CT
 | 
			
		||||
 | 
			
		||||
import Data.Email
 | 
			
		||||
import Data.Email.Header
 | 
			
		||||
       (Header)
 | 
			
		||||
 | 
			
		||||
import System.IO
 | 
			
		||||
       (stdin)
 | 
			
		||||
 | 
			
		||||
combine :: (MonadResource m, MonadThrow m, MonadIO m) => ConduitM FilePath Header m ()
 | 
			
		||||
combine = await >>= \case
 | 
			
		||||
  Nothing -> pure ()
 | 
			
		||||
  Just path -> (CB.sourceFile path .| parseEmail) >> combine
 | 
			
		||||
 | 
			
		||||
run :: IO ()
 | 
			
		||||
run = do
 | 
			
		||||
  runResourceT $ runConduit (CB.sourceHandle stdin .| CT.decode CT.utf8 .| CT.lines .| C.map T.unpack .| combine .| C.mapM_ (liftIO . print))
 | 
			
		||||
		Reference in New Issue
	
	Block a user