@@ -420,7 +420,9 @@ readU = Unfold step inject
420420 return $ ReadUState (ForeignPtr end contents) (Ptr start)
421421
422422 {-# INLINE_LATE step #-}
423− step (ReadUState (ForeignPtr end _) p) | p == (Ptr end) = return D.Stop
423+ step (ReadUState fp@(ForeignPtr end _) p) | p == (Ptr end) =
424+ let x = unsafeInlineIO $ touchForeignPtr fp
425+ in x `seq` return D.Stop
424426 step (ReadUState fp p) = do
425427 -- unsafeInlineIO allows us to run this in Identity monad for pure
426428 -- toList/foldr case which makes them much faster due to not
@@ -428,10 +430,7 @@ readU = Unfold step inject
428430 --
429431 -- This should be safe as the array contents are guaranteed to be
430432 -- evaluated/written to before we peek at them.
431− let !x = unsafeInlineIO $ do
432− r <- peek p
433− touchForeignPtr fp
434− return r
433+ let !x = unsafeInlineIO $ peek p
435434 return $ D.Yield x
436435 (ReadUState fp (p `plusPtr` (sizeOf (undefined :: a))))
437436