@@ -8,6 +8,7 @@
8-- Portability : GHC
8-- Portability : GHC
10{-# LANGUAGE CPP #-}
10{-# LANGUAGE CPP #-}
11+{-# LANGUAGE ScopedTypeVariables #-}
12#ifdef __HADDOCK_VERSION__
13#ifdef __HADDOCK_VERSION__
13#undef INSPECTION
14#undef INSPECTION
@@ -29,6 +30,11 @@ module Streamly.Benchmark.FileIO.Stream
29 , sumBytes
30 , sumBytes
31 , catStreamWrite
32 , catStreamWrite
33 , linesUnlinesCopy
39 , linesUnlinesCopy
34 , wordsUnwordsCopyWord8
40 , wordsUnwordsCopyWord8
@@ -50,9 +56,10 @@ module Streamly.Benchmark.FileIO.Stream
59+import Control.Exception (SomeException)
53import Data.Char (ord, chr)
60import Data.Char (ord, chr)
54import Data.Word (Word8)
61import Data.Word (Word8)
55−import System.IO (Handle)
62+import System.IO (Handle, hClose)
56import Prelude hiding (last, length)
63import Prelude hiding (last, length)
58import qualified Streamly.FileSystem.Handle as FH
65import qualified Streamly.FileSystem.Handle as FH
@@ -179,6 +186,76 @@ inspect $ 'catStreamWrite `hasNoType` ''AT.FlattenState
179inspect $ 'catStreamWrite `hasNoType` ''D.ConcatMapUState
186inspect $ 'catStreamWrite `hasNoType` ''D.ConcatMapUState
189+-- | Send the file contents to /dev/null with exception handling
190+{-# INLINE catBracket #-}
191+catBracket :: Handle -> Handle -> IO ()
192+catBracket devNull inh =
193+ let readEx = IUF.bracket (return ()) (\_ -> hClose inh) (\_ -> FH.read)
194+ in S.fold (FH.write devNull) $ S.unfold readEx inh
197+inspect $ hasNoTypeClasses 'catBracket
198+-- inspect $ 'catBracket `hasNoType` ''Step
199+-- inspect $ 'catBracket `hasNoType` ''AT.FlattenState
200+-- inspect $ 'catBracket `hasNoType` ''D.ConcatMapUState
203+-- | Send the file contents to /dev/null with exception handling
204+{-# INLINE catBracketStream #-}
205+catBracketStream :: Handle -> Handle -> IO ()
206+catBracketStream devNull inh =
207+ let readEx = S.bracket (return ()) (\_ -> hClose inh)
208+ (\_ -> IFH.toStream inh)
209+ in IFH.fromStream devNull $ readEx
212+inspect $ hasNoTypeClasses 'catBracketStream
213+-- inspect $ 'catBracketStream `hasNoType` ''Step
216+-- | Send the file contents to /dev/null with exception handling
217+{-# INLINE catOnException #-}
218+catOnException :: Handle -> Handle -> IO ()
219+catOnException devNull inh =
220+ let readEx = IUF.onException (hClose inh) FH.read
221+ in S.fold (FH.write devNull) $ S.unfold readEx inh
224+inspect $ hasNoTypeClasses 'catOnException
225+-- inspect $ 'catOnException `hasNoType` ''Step
226+-- inspect $ 'catOnException `hasNoType` ''AT.FlattenState
227+-- inspect $ 'catOnException `hasNoType` ''D.ConcatMapUState
230+-- | Send the file contents to /dev/null with exception handling
231+{-# INLINE catFinally #-}
232+catFinally :: Handle -> Handle -> IO ()
233+catFinally devNull inh =
234+ let readEx = IUF.finally (hClose inh) FH.read
235+ in S.fold (FH.write devNull) $ S.unfold readEx inh
238+inspect $ hasNoTypeClasses 'catFinally
239+-- inspect $ 'catFinally `hasNoType` ''Step
240+-- inspect $ 'catFinally `hasNoType` ''AT.FlattenState
241+-- inspect $ 'catFinally `hasNoType` ''D.ConcatMapUState
244+-- | Send the file contents to /dev/null with exception handling
245+{-# INLINE catHandle #-}
246+catHandle :: Handle -> Handle -> IO ()
247+catHandle devNull inh =
248+ let readEx = IUF.handle (\(_e :: SomeException) -> hClose inh >> return 10)
250+ in S.fold (FH.write devNull) $ S.unfold readEx inh
253+inspect $ hasNoTypeClasses 'catHandle
254+-- inspect $ 'catHandle `hasNoType` ''Step
255+-- inspect $ 'catHandle `hasNoType` ''AT.FlattenState
256+-- inspect $ 'catHandle `hasNoType` ''D.ConcatMapUState
182-- | Copy file
259-- | Copy file
183{-# INLINE copy #-}
260{-# INLINE copy #-}
184copy :: Handle -> Handle -> IO ()
261copy :: Handle -> Handle -> IO ()