    module Data.Tuple.Example where

    import qualified Data.Tuple.Lazy as Lazy
    import qualified Data.Tuple.Strict as Strict

    import Data.List.HT (sieve, )

    partitionLazy :: (a -> Bool) -> [a] -> ([a], [a])
    partitionLazy p =
       foldr
          (\x -> (if p x then Lazy.mapFst else Lazy.mapSnd) (x:))
          ([], [])

    partitionStrict :: (a -> Bool) -> [a] -> ([a], [a])
    partitionStrict p =
       foldr
          (\x -> (if p x then Strict.mapFst else Strict.mapSnd) (x:))
          ([], [])

    mainPartitionRuns :: IO ()
    mainPartitionRuns =
       print $ partitionLazy (>=0) $ repeat (0::Int)

    mainPartitionBlocks :: IO ()
    mainPartitionBlocks =
       print $ partitionStrict (>=0) $ repeat (0::Int)

    printSomeChars :: (Show a) => a -> IO ()
    printSomeChars = putStrLn . sieve 100000 . show

    mainMemoryOk :: IO ()
    mainMemoryOk =
       printSomeChars $ Strict.mapSnd (1+) $ (iterate (1+) (0::Int), 0::Int)

    mainMemoryLeak :: IO ()
    mainMemoryLeak =
       printSomeChars $ Lazy.mapSnd (1+) $ (iterate (1+) (0::Int), 0::Int)