@@ -239,6 +239,7 @@ where
240import Control.Monad (void)
240import Control.Monad (void)
241import Data.Bifunctor (first)
241import Data.Bifunctor (first)
242+import Data.Either (isLeft, isRight, fromLeft, fromRight)
242import Data.Functor.Identity (Identity(..))
243import Data.Functor.Identity (Identity(..))
243import Data.Int (Int64)
244import Data.Int (Int64)
244import Data.Map.Strict (Map)
245import Data.Map.Strict (Map)
@@ -1162,67 +1163,10 @@ distribute = Prelude.foldr (teeWith (:)) (fromPure [])
1162{-# INLINE partitionByM #-}
1163{-# INLINE partitionByM #-}
1163partitionByM :: Monad m
1164partitionByM :: Monad m
1164 => (a -> m (Either b c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
1165 => (a -> m (Either b c)) -> Fold m b x -> Fold m c y -> Fold m a (x, y)
1165−partitionByM f (Fold stepL beginL doneL) (Fold stepR beginR doneR) =
1166+partitionByM f fld1 fld2 =
1166− Fold step begin done
1167+ let l = lmap (fromLeft undefined) fld1 -- :: Fold m (Either b c) x
1167−
1168+ r = lmap (fromRight undefined) fld2 -- :: Fold m (Either b c) y
1168− where
1169+ in lmapM f (teeWith (,) (filter isLeft l) (filter isRight r))
1178− Partial sR -> RunBoth sL sR
1179− Done bR -> RunLeft sL bR
1182− Partial sR -> Partial $ RunRight bL sR
1183− Done bR -> Done (bL, bR)
1185− step (RunBoth sL sR) a = do
1193− Partial sres -> RunBoth sres sR
1194− Done bres -> RunRight bres sR
1200− Partial sres -> RunBoth sL sres
1201− Done bres -> RunLeft sL bres
1202− step (RunLeft sL bR) a = do
1209− Partial sres -> Partial $ RunLeft sres bR
1210− Done bres -> Done (bres, bR)
1211− Right _ -> return $ Partial $ RunLeft sL bR
1212− step (RunRight bL sR) a = do
1215− Left _ -> return $ Partial $ RunRight bL sR
1220− Partial sres -> Partial $ RunRight bL sres
1221− Done bres -> Done (bL, bres)
1223− done (RunBoth sL sR) = (,) <$> doneL sL <*> doneR sR
1224− done (RunLeft sL bR) = (,bR) <$> doneL sL
1225− done (RunRight bL sR) = (bL,) <$> doneR sR
1227-- | Similar to 'partitionByM' but terminates when the first fold terminates.
1171-- | Similar to 'partitionByM' but terminates when the first fold terminates.
@@ -1659,60 +1603,10 @@ classify fld = classifyWith fst (lmap snd fld)
1659{-# INLINE unzipWithM #-}
1603{-# INLINE unzipWithM #-}
1660unzipWithM :: Monad m
1604unzipWithM :: Monad m
1661 => (a -> m (b,c)) -> Fold m b x -> Fold m c y -> Fold m a (x,y)
1605 => (a -> m (b,c)) -> Fold m b x -> Fold m c y -> Fold m a (x,y)
1662−unzipWithM f (Fold stepL beginL doneL) (Fold stepR beginR doneR) =
1606+unzipWithM f fld1 fld2 =
1663− Fold step begin done
1607+ let f1 = lmap fst fld1 -- :: Fold m (b, c) b
1664−
1608+ f2 = lmap snd fld2 -- :: Fold m (b, c) c
1665− where
1609+ in lmapM f (teeWith (,) f1 f2)
1675− Partial sR -> RunBoth sL sR
1676− Done bR -> RunLeft sL bR
1679− Partial sR -> Partial $ RunRight bL sR
1680− Done bR -> Done (bL, bR)
1682− step (RunBoth sL sR) a = do
1691− Partial sresR -> RunBoth sresL sresR
1692− Done bresR -> RunLeft sresL bresR
1696− Partial sresR -> Partial $ RunRight bresL sresR
1697− Done bresR -> Done (bresL, bresR)
1698− step (RunLeft sL bR) a = do
1703− Partial sresL -> Partial $ RunLeft sresL bR
1704− Done bresL -> Done (bresL, bR)
1705− step (RunRight bL sR) a = do
1710− Partial sresR -> Partial $ RunRight bL sresR
1711− Done bresR -> Done (bL, bresR)
1713− done (RunBoth sL sR) = (,) <$> doneL sL <*> doneR sR
1714− done (RunLeft sL bR) = (,bR) <$> doneL sL
1715− done (RunRight bL sR) = (bL,) <$> doneR sR
1717-- | Similar to 'unzipWithM' but terminates when the first fold terminates.
1611-- | Similar to 'unzipWithM' but terminates when the first fold terminates.