on 29f64fe help sign in
streamly/src/Asyncly/Examples/MergeSortedStreams.hs
40 lines 1.2 kB history raw
1{-# LANGUAGE FlexibleContexts #-}
3module Asyncly.Examples.MergeSortedStreams where
5import Data.Word
6import System.Random
7import Data.List (sort)
8import Asyncly
9import qualified Asyncly.Prelude as A
11getSorted :: MonadIO m => AsyncT m Word16
12getSorted = do
13 g <- liftIO getStdGen
14 let ls = take 100000 (randoms g) :: [Word16]
15 foldMapWith (<>) return (sort ls)
17mergeAsync :: (Ord a, MonadAsync m) => AsyncT m a -> AsyncT m a -> AsyncT m a
18mergeAsync a b = do
19 x <- lift $ async a
20 y <- lift $ async b
21 merge x y
23merge :: (Ord a, MonadAsync m) => AsyncT m a -> AsyncT m a -> AsyncT m a
24merge a b = do
25 a1 <- lift $ A.uncons a
26 case a1 of
27 Nothing -> b
28 Just (x, ma) -> do
29 b1 <- lift $ A.uncons b
30 case b1 of
31 Nothing -> return x <> ma
32 Just (y, mb) ->
33 if (y < x)
34 then (return y) <> merge (return x <> ma) mb
35 else (return x) <> merge ma (return y <> mb)
37mergeSortedStreams :: IO ()
38mergeSortedStreams = do
39 xs <- toList $ mergeAsync getSorted getSorted
40 putStrLn $ show $ length xs