{- | This module implements something that is very similar to our asynchronous exception approach. However, it does not expose a memory leak. Why? -} module Main where unzipPattern :: [(a,b)] -> ([a], [b]) unzipPattern = foldr (\(a,b) ~(as,bs) -> (a:as, b:bs)) ([], []) unzipSelector :: [(a,b)] -> ([a], [b]) unzipSelector = foldr (\(a,b) asbs -> (a : fst asbs, b : snd asbs)) ([], []) noSpaceLeak :: IO () noSpaceLeak = let xs = repeat ('a', 42::Int) (ys,zs) = unzipSelector xs in do mapM_ putChar ys print $ last zs {- ee-unzip +RTS -M1m -c30 -RTS -} main :: IO () main = noSpaceLeak