summaryrefslogtreecommitdiff
path: root/ByteStringUtil.hs
diff options
context:
space:
mode:
Diffstat (limited to 'ByteStringUtil.hs')
-rw-r--r--ByteStringUtil.hs29
1 files changed, 29 insertions, 0 deletions
diff --git a/ByteStringUtil.hs b/ByteStringUtil.hs
new file mode 100644
index 0000000..9711e0b
--- /dev/null
+++ b/ByteStringUtil.hs
@@ -0,0 +1,29 @@
1module ByteStringUtil where
2
3import Data.ByteString.Lazy.Internal
4import Data.ByteString.Lazy as L
5import qualified Data.ByteString as S
6import System.IO
7import System.IO.Unsafe
8
9oneMeg :: Int
10oneMeg = 1048576
11
12hGetContentsN :: Int -> Handle -> IO ByteString
13hGetContentsN kk h = lazyRead
14 where
15 k = kk - chunkOverhead
16 lazyRead = unsafeInterleaveIO loop
17
18 loop = do
19 c <- S.hGetSome h k -- only blocks if there is no data available
20 if S.null c
21 then hClose h >> return Empty
22 else do cs <- lazyRead
23 return (Chunk c cs)
24
25readBigFile :: FilePath -> IO ByteString
26readBigFile fname = do
27 h <- openFile fname ReadMode
28 hGetContentsN oneMeg h
29