on master help sign in
simplify mergeBy implementation
5e38a57Harendra Kumar
src/Streamly/Streams/StreamD.hs+32−55
@@ -878,65 +878,42 @@ cmpBy cmp (Stream step1 t1) (Stream step2 t2) = cmp_loop0 SPEC t1 t2
878-- Merging
878-- Merging
879------------------------------------------------------------------------------
879------------------------------------------------------------------------------
880
880
881−data MergeWithState l r o
882− = MergeBoth l r
883− | MergeWithLeft l r o
884− | MergeWithRight l r o
885− | MergeNoMore (Either l r)
886−
887{-# INLINE_NORMAL mergeBy #-}
881{-# INLINE_NORMAL mergeBy #-}
888mergeBy :: (Monad m) => (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
882mergeBy :: (Monad m) => (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
889mergeBy f (Stream stepa ta) (Stream stepb tb) =
883mergeBy f (Stream stepa ta) (Stream stepb tb) =
890− Stream step (MergeBoth ta tb)
884+ Stream step (Just ta, Just tb, Nothing, Nothing)
885+ where
891 {-# INLINE_LATE step #-}
886 {-# INLINE_LATE step #-}
887+
888+ -- one of the values is missing, and the corresponding stream is running
892− step gst (MergeBoth sa sb) = do
889+ step gst (Just sa, sb, Nothing, b) = do
893− ra <- stepa (rstState gst) sa
890+ r <- stepa (rstState gst) sa
894− rb <- stepb (rstState gst) sb
895− case (ra, rb) of
891+ return $ case r of
896− (Yield xa sa', Yield xb sb') -> do
892+ Yield a sa' -> Skip (Just sa', sb, Just a, b)
897− case f xa xb of
893+ Skip sa' -> Skip (Just sa', sb, Nothing, b)
898− LT ->
894+ Stop -> Skip (Nothing, sb, Nothing, b)
899− return $ Yield xa (MergeWithRight sa' sb' xb)
895+
900− _ ->
896+ step gst (sa, Just sb, a, Nothing) = do
901− return $ Yield xb (MergeWithLeft sa' sb' xa)
897+ r <- stepb (rstState gst) sb
902− (Yield xa sa', Stop) -> return $ Yield xa (MergeNoMore (Left sa'))
898+ return $ case r of
903− (Stop, Yield xb sb') -> return $ Yield xb (MergeNoMore (Right sb'))
899+ Yield b sb' -> Skip (sa, Just sb', a, Just b)
904− (Yield xa sa', Skip sb') -> return $ Skip (MergeWithLeft sa' sb' xa)
900+ Skip sb' -> Skip (sa, Just sb', a, Nothing)
905− (Skip sa', Yield xb sb') -> return $ Skip (MergeWithRight sa' sb' xb)
901+ Stop -> Skip (sa, Nothing, a, Nothing)
906− (Skip sa', Skip sb') -> return $ Skip (MergeBoth sa' sb')
902+
907− (Skip sa', Stop) -> return $ Skip (MergeNoMore (Left sa'))
903+ -- both the values are available
908− (Stop, Skip sb') -> return $ Skip (MergeNoMore (Right sb'))
904+ step _ (sa, sb, Just a, Just b) =
909− (Stop, Stop) -> return Stop
905+ return $ case f a b of
910− step gst (MergeWithLeft sa sb x) = do
906+ LT -> Yield a (sa, sb, Nothing, Just b)
911− rb <- stepb (rstState gst) sb
907+ _ -> Yield b (sa, sb, Just a, Nothing)
912− case rb of
908+
913− Yield xb sb' -> do
909+ -- one of the values is missing, corresponding stream is done
914− case f x xb of
910+ step _ (Nothing, sb, Nothing, Just b) = do
915− LT -> return $ Yield x (MergeWithRight sa sb' xb)
911+ return $ Yield b (Nothing, sb, Nothing, Nothing)
916− _ -> return $ Yield xb (MergeWithLeft sa sb' x)
912+
917− Skip sb' -> return $ Skip (MergeWithLeft sa sb' x)
913+ step _ (sa, Nothing, Just a, Nothing) = do
918− Stop -> return $ Yield x (MergeNoMore (Left sa))
914+ return $ Yield a (sa, Nothing, Nothing, Nothing)
919− step gst (MergeWithRight sa sb x) = do
915+
920− ra <- stepa (rstState gst) sa
916+ step _ (Nothing, Nothing, Nothing, Nothing) = return Stop
921− case ra of
922− Yield xa sa' -> do
923− case f xa x of
924− LT -> return $ Yield xa (MergeWithRight sa' sb x)
925− _ -> return $ Yield x (MergeWithLeft sa' sb xa)
926− Skip sa' -> return $ Skip (MergeWithRight sa' sb x)
927− Stop -> return $ Yield x (MergeNoMore (Right sb))
928− step gst (MergeNoMore (Left sa)) = do
929− ra <- stepa (rstState gst) sa
930− case ra of
931− Yield xa sa' -> return $ Yield xa (MergeNoMore (Left sa'))
932− Skip sa' -> return $ Skip (MergeNoMore (Left sa'))
933− Stop -> return Stop
934− step gst (MergeNoMore (Right sb)) = do
935− rb <- stepb (rstState gst) sb
936− case rb of
937− Yield xb sb' -> return $ Yield xb (MergeNoMore (Right sb'))
938− Skip sb' -> return $ Skip (MergeNoMore (Right sb'))
939− Stop -> return Stop
940
917
941------------------------------------------------------------------------------
918------------------------------------------------------------------------------
942-- Transformation comprehensions
919-- Transformation comprehensions