WHNF the tail of a bytestring on decodeFile, will close the resource
authorDon Stewart <dons@galois.com>
Mon, 25 Aug 2008 21:01:09 +0000 (23:01 +0200)
committerDon Stewart <dons@galois.com>
Mon, 25 Aug 2008 21:01:09 +0000 (23:01 +0200)
binary.cabal
src/Data/Binary.hs

index f523e1d..329e894 100644 (file)
@@ -1,5 +1,5 @@
 name:            binary
-version:         0.4.2
+version:         0.4.3
 license:         BSD3
 license-file:    LICENSE
 author:          Lennart Kolmodin <kolmodin@dtek.chalmers.se>
@@ -30,7 +30,7 @@ library
     cpp-options: -DBYTESTRING_IN_BASE
   else
     -- in base 1.0 and 3.0 bytestring is a separate package
-    build-depends: base < 2.0 || >= 3, bytestring >= 0.9
+    build-depends: base < 2.0 || >= 3, bytestring >= 0.9.1.0
 
   if flag(split-base)
     build-depends:   base >= 3.0, containers, array
index a2fb514..fdccf06 100644 (file)
@@ -251,7 +251,7 @@ decode = runGet get
 encodeFile :: Binary a => FilePath -> a -> IO ()
 encodeFile f v = L.writeFile f (encode v)
 
--- | Lazily reconstruct a value previously written to a file
+-- | Lazily reconstruct a value previously written to a file.
 --
 -- This is just a convenience function, it's defined simply as:
 --
@@ -261,8 +261,20 @@ encodeFile f v = L.writeFile f (encode v)
 --
 -- > return . decode . decompress =<< B.readFile f
 --
+-- After contructing the data from the input file, 'decodeFile' checks
+-- if the file is empty, and in doing so will force the associated file
+-- handle closed, if it is indeed empty. If the file is not empty, 
+-- it is up to the decoding instance to consume the rest of the data,
+-- or otherwise finalise the resource.
+--
 decodeFile :: Binary a => FilePath -> IO a
-decodeFile f = liftM decode (L.readFile f)
+decodeFile f = do
+    s <- L.readFile f
+    return $ runGet (do v <- get
+                        m <- isEmpty
+                        m `seq` return v) s
+
+-- needs bytestring 0.9.1.x to work 
 
 ------------------------------------------------------------------------
 -- Lazy put and get