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 :: (a -> Bool) -> [a] -> ([a], [a]) partitionLazy a -> Bool p = (a -> ([a], [a]) -> ([a], [a])) -> ([a], [a]) -> [a] -> ([a], [a]) forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr (\a x -> (if a -> Bool p a x then ([a] -> [a]) -> ([a], [a]) -> ([a], [a]) forall a c b. (a -> c) -> (a, b) -> (c, b) Lazy.mapFst else ([a] -> [a]) -> ([a], [a]) -> ([a], [a]) forall b c a. (b -> c) -> (a, b) -> (a, c) Lazy.mapSnd) (a xa -> [a] -> [a] forall a. a -> [a] -> [a] :)) ([], []) partitionStrict :: (a -> Bool) -> [a] -> ([a], [a]) partitionStrict :: (a -> Bool) -> [a] -> ([a], [a]) partitionStrict a -> Bool p = (a -> ([a], [a]) -> ([a], [a])) -> ([a], [a]) -> [a] -> ([a], [a]) forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr (\a x -> (if a -> Bool p a x then ([a] -> [a]) -> ([a], [a]) -> ([a], [a]) forall a c b. (a -> c) -> (a, b) -> (c, b) Strict.mapFst else ([a] -> [a]) -> ([a], [a]) -> ([a], [a]) forall b c a. (b -> c) -> (a, b) -> (a, c) Strict.mapSnd) (a xa -> [a] -> [a] forall a. a -> [a] -> [a] :)) ([], []) mainPartitionRuns :: IO () mainPartitionRuns :: IO () mainPartitionRuns = ([Int], [Int]) -> IO () forall a. Show a => a -> IO () print (([Int], [Int]) -> IO ()) -> ([Int], [Int]) -> IO () forall a b. (a -> b) -> a -> b $ (Int -> Bool) -> [Int] -> ([Int], [Int]) forall a. (a -> Bool) -> [a] -> ([a], [a]) partitionLazy (Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int 0) ([Int] -> ([Int], [Int])) -> [Int] -> ([Int], [Int]) forall a b. (a -> b) -> a -> b $ Int -> [Int] forall a. a -> [a] repeat (Int 0::Int) mainPartitionBlocks :: IO () mainPartitionBlocks :: IO () mainPartitionBlocks = ([Int], [Int]) -> IO () forall a. Show a => a -> IO () print (([Int], [Int]) -> IO ()) -> ([Int], [Int]) -> IO () forall a b. (a -> b) -> a -> b $ (Int -> Bool) -> [Int] -> ([Int], [Int]) forall a. (a -> Bool) -> [a] -> ([a], [a]) partitionStrict (Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >=Int 0) ([Int] -> ([Int], [Int])) -> [Int] -> ([Int], [Int]) forall a b. (a -> b) -> a -> b $ Int -> [Int] forall a. a -> [a] repeat (Int 0::Int) printSomeChars :: (Show a) => a -> IO () printSomeChars :: a -> IO () printSomeChars = String -> IO () putStrLn (String -> IO ()) -> (a -> String) -> a -> IO () forall b c a. (b -> c) -> (a -> b) -> a -> c . Int -> String -> String forall a. Int -> [a] -> [a] sieve Int 100000 (String -> String) -> (a -> String) -> a -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . a -> String forall a. Show a => a -> String show mainMemoryOk :: IO () mainMemoryOk :: IO () mainMemoryOk = ([Int], Int) -> IO () forall a. Show a => a -> IO () printSomeChars (([Int], Int) -> IO ()) -> ([Int], Int) -> IO () forall a b. (a -> b) -> a -> b $ (Int -> Int) -> ([Int], Int) -> ([Int], Int) forall b c a. (b -> c) -> (a, b) -> (a, c) Strict.mapSnd (Int 1Int -> Int -> Int forall a. Num a => a -> a -> a +) (([Int], Int) -> ([Int], Int)) -> ([Int], Int) -> ([Int], Int) forall a b. (a -> b) -> a -> b $ ((Int -> Int) -> Int -> [Int] forall a. (a -> a) -> a -> [a] iterate (Int 1Int -> Int -> Int forall a. Num a => a -> a -> a +) (Int 0::Int), Int 0::Int) mainMemoryLeak :: IO () mainMemoryLeak :: IO () mainMemoryLeak = ([Int], Int) -> IO () forall a. Show a => a -> IO () printSomeChars (([Int], Int) -> IO ()) -> ([Int], Int) -> IO () forall a b. (a -> b) -> a -> b $ (Int -> Int) -> ([Int], Int) -> ([Int], Int) forall b c a. (b -> c) -> (a, b) -> (a, c) Lazy.mapSnd (Int 1Int -> Int -> Int forall a. Num a => a -> a -> a +) (([Int], Int) -> ([Int], Int)) -> ([Int], Int) -> ([Int], Int) forall a b. (a -> b) -> a -> b $ ((Int -> Int) -> Int -> [Int] forall a. (a -> a) -> a -> [a] iterate (Int 1Int -> Int -> Int forall a. Num a => a -> a -> a +) (Int 0::Int), Int 0::Int)