streamly/examples/MergeSort.hs

41 lines
1.1 KiB
Haskell
Raw Normal View History

{-# LANGUAGE FlexibleContexts #-}
import Data.Word
2017-12-04 13:39:36 +03:00
import System.Random (getStdGen, randoms)
import Data.List (sort)
import Streamly
import Streamly.Prelude (yieldM)
import qualified Streamly.Prelude as A
2018-05-13 08:18:18 +03:00
getSorted :: Serial Word16
getSorted = do
g <- yieldM getStdGen
let ls = take 100000 (randoms g) :: [Word16]
foldMap return (sort ls)
-- | merge two streams generating the elements from each in parallel
2018-05-13 08:18:18 +03:00
mergeAsync :: Ord a => Serial a -> Serial a -> Serial a
mergeAsync a b = do
x <- yieldM $ mkAsync a
y <- yieldM $ mkAsync b
merge x y
2018-05-13 08:18:18 +03:00
merge :: Ord a => Serial a -> Serial a -> Serial a
merge a b = do
a1 <- yieldM $ A.uncons a
case a1 of
Nothing -> b
Just (x, ma) -> do
b1 <- yieldM $ A.uncons b
case b1 of
Nothing -> return x <> ma
Just (y, mb) ->
if (y < x)
then (return y) <> merge (return x <> ma) mb
else (return x) <> merge ma (return y <> mb)
main :: IO ()
main = do
2017-10-26 10:36:47 +03:00
xs <- A.toList $ mergeAsync getSorted getSorted
putStrLn $ show $ length xs