
Hi
With binary 0.5,
src <- decodeFile "_make/_make" return $! src
I'm pretty sure I was on the latest Cabal released version of binary, and the above trick did not work. It _usually_ worked, but every so often I'd get a locking error.
Shouldn't you use rnf[1]? Also, there seems to be binary-strict on Hackage, but I don't know if it is being maintained anymore.
Map.size is rnf on maps, I know exactly what its doing so in this case I'm willing to cheat a little - but rnf would certainly be the more principled way of doing it.
I suggest you use withFile instead and decode from the Handle that gives you (via hGetContents) rather than decodeFile from the file name. That makes it much clearer. Of course you have to avoid doing lazy stuff, but that should be ok, Binary is strict in reading by default.
That was my first attempt, but the types didn't match up. I can withFile using a System.IO handle, but Data.Binary doesn't seem to be able to start going from a Handle. I guess I have to hop via the ByteString bit myself with hGetContents. That's perfectly fine, and much better than currently. However
readDB = io $ (dbLocation >>= r) `catch` (λ_ → return empty) where r x = fmap (decode · BL.fromChunks · return) $ B.readFile x
This seems to be a very nice way of doing it, the strictness is explicit in the ByteString.readFile. I've gone for this in my code. Thanks Neil