safeWithFile :: (NFData a) => String -> IOMode -> (Handle -> IO a) -> IO a
safeWithFile name mode f = withFile name mode $ f >=> (return $!!)
Sample use:
*SafeWithFile> safeWithFile "SafeWithFile.hs" ReadMode hGetContents >>= putStr
module SafeWithFile (safeWithFile) where
import Control.DeepSeq
import System.IO
import Control.Monad
safeWithFile :: (NFData a) => String -> IOMode -> (Handle -> IO a) -> IO a
safeWithFile name mode f = withFile name mode $ f >=> (return $!!)