@@ -789,30 +789,134 @@ zipWithM f = go
789mergeByM :: Monad m =>
789mergeByM :: Monad m =>
790 (a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
790 (a -> a -> m Ordering) -> Stream m a -> Stream m a -> Stream m a
791mergeByM cmp = go
791mergeByM cmp = go
795+ go mx my = mkStream $ \st yld sng stp -> do
796+ let stop = foldStream st yld sng stp my
797+ single x = foldStream st yld sng stp (goX0 x my)
798+ yield x rx = foldStream st yld sng stp (goX x rx my)
799+ foldStream st yield single stop mx
801+ goX0 x my = mkStream $ \st yld sng _ -> do
806+ GT -> yld y (fromPure x)
807+ _ -> yld x (fromPure y)
811+ GT -> yld y (goX0 x ry)
812+ _ -> yld x (y `cons` ry)
813+ in foldStream st yield single stop my
815+ goX x mx my = mkStream $ \st yld _ _ -> do
820+ GT -> yld y (x `cons` mx)
821+ _ -> yld x (goY0 mx y)
825+ GT -> yld y (goX x mx ry)
826+ _ -> yld x (goY mx y ry)
827+ in foldStream st yield single stop my
829+ goY0 mx y = mkStream $ \st yld sng _ -> do
834+ GT -> yld y (fromPure x)
835+ _ -> yld x (fromPure y)
839+ GT -> yld y (x `cons` rx)
840+ _ -> yld x (goY0 rx y)
841+ in foldStream st yield single stop mx
843+ goY mx y my = mkStream $ \st yld _ _ -> do
848+ GT -> yld y (goX0 x my)
849+ _ -> yld x (y `cons` my)
853+ GT -> yld y (goX x rx my)
854+ _ -> yld x (goY rx y my)
855+ in foldStream st yield single stop mx
857+{-# INLINE mergeBy #-}
858+mergeBy :: (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
859+-- XXX GHC: This has slightly worse performance than replacing "r <- cmp x y"
860+-- with "let r = cmp x y" in the monadic version. The definition below is
861+-- exactly the same as mergeByM except this change.
862+-- mergeBy cmp = mergeByM (\a b -> return $ cmp a b)
793 go mx my = mkStream $ \st yld sng stp -> do
867 go mx my = mkStream $ \st yld sng stp -> do
794− let mergeWithY a ra =
868+ let stop = foldStream st yld sng stp my
869+ single x = foldStream st yld sng stp (goX0 x my)
795− let stop2 = foldStream st yld sng stp mx
870+ yield x rx = foldStream st yld sng stp (goX x rx my)
796− single2 b = do
871+ foldStream st yield single stop mx
873+ goX0 x my = mkStream $ \st yld sng _ -> do
798− case r of
876+ case cmp x y of
799− GT -> yld b (go (a `cons` ra) nil)
877+ GT -> yld y (fromPure x)
800− _ -> yld a (go ra (b `cons` nil))
878+ _ -> yld x (fromPure y)
801− yield2 b rb = do
879+ yield y ry = do
802− r <- cmp a b
880+ case cmp x y of
803− case r of
881+ GT -> yld y (goX0 x ry)
804− GT -> yld b (go (a `cons` ra) rb)
805− _ -> yld a (go ra (b `cons` rb))
882+ _ -> yld x (y `cons` ry)
806− in foldStream st yield2 single2 stop2 my
883+ in foldStream st yield single stop my
807− let stopX = foldStream st yld sng stp my
884+
808− singleX a = mergeWithY a nil
885+ goX x mx my = mkStream $ \st yld _ _ -> do
809− yieldX = mergeWithY
886+ let stop = yld x mx
810− foldStream st yieldX singleX stopX mx
887+ single y = do
812−{-# INLINABLE mergeBy #-}
889+ GT -> yld y (x `cons` mx)
813−mergeBy :: Monad m =>
890+ _ -> yld x (goY0 mx y)
814− (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
891+ yield y ry = do
815−mergeBy cmp = mergeByM (\a b -> return $ cmp a b)
892+ case cmp x y of
893+ GT -> yld y (goX x mx ry)
894+ _ -> yld x (goY mx y ry)
895+ in foldStream st yield single stop my
897+ goY0 mx y = mkStream $ \st yld sng _ -> do
901+ GT -> yld y (fromPure x)
902+ _ -> yld x (fromPure y)
905+ GT -> yld y (x `cons` rx)
906+ _ -> yld x (goY0 rx y)
907+ in foldStream st yield single stop mx
909+ goY mx y my = mkStream $ \st yld _ _ -> do
913+ GT -> yld y (goX0 x my)
914+ _ -> yld x (y `cons` my)
917+ GT -> yld y (goX x rx my)
918+ _ -> yld x (goY rx y my)
919+ in foldStream st yield single stop mx
817------------------------------------------------------------------------------
921------------------------------------------------------------------------------
818-- Transformation comprehensions
922-- Transformation comprehensions