Packages like `text` reach into the unstable bowels of #GHC to avoid allocating intermediate structures when reading IO.
But it is possible to do fusible lazy IO:
```
produce :: IO [Char]
produce = IO $ \s0 ->
(# s0 , build $ \c n ->
let go s = case runIO getChar s of
(# s' , x #) -> c x (go s')
in go s0
#)
```
Perhaps GHC could expose something like that and the text package could use it.




