@@ -354,7 +354,7 @@ demuxGeneric getKey getFold =
354354{-# INLINE demuxerToContainer #-}
355355demuxerToContainer :: (Monad m , IsMap f , Traversable f ) =>
356356 (a -> Key f )
357- -> (Key f -> m (Fold m a b ))
357+ -> (Key f -> m (Maybe ( Fold m a b ) ))
358358 -> Fold m a (f b )
359359demuxerToContainer getKey getFold =
360360 Fold (\ s a -> Partial <$> step s a) (Partial <$> initial) undefined final
@@ -388,8 +388,10 @@ demuxerToContainer getKey getFold =
388388 let k = getKey a
389389 case IsMap. mapLookup k kv of
390390 Nothing -> do
391- fld <- getFold k
392- runFold kv kv1 fld (k, a)
391+ mfld <- getFold k
392+ case mfld of
393+ Nothing -> pure $ Tuple' kv kv1
394+ Just fld -> runFold kv kv1 fld (k, a)
393395 Just f -> runFold kv kv1 f (k, a)
394396
395397 final (Tuple' kv kv1) = do
@@ -408,7 +410,7 @@ demuxerToContainer getKey getFold =
408410{-# INLINE demuxScanGeneric #-}
409411demuxScanGeneric :: (Monad m , IsMap f , Traversable f ) =>
410412 (a -> Key f )
411- -> (Key f -> m (Fold m a b ))
413+ -> (Key f -> m (Maybe ( Fold m a b ) ))
412414 -> Scanl m a (m (f b ), Maybe (Key f , b ))
413415demuxScanGeneric getKey getFold =
414416 Scanl (\ s a -> Partial <$> step s a) (Partial <$> initial) extract final
@@ -439,8 +441,10 @@ demuxScanGeneric getKey getFold =
439441 let k = getKey a
440442 case IsMap. mapLookup k kv of
441443 Nothing -> do
442- fld <- getFold k
443- runFold kv fld (k, a)
444+ mfld <- getFold k
445+ case mfld of
446+ Nothing -> pure $ Tuple' kv Nothing
447+ Just fld -> runFold kv fld (k, a)
444448 Just f -> runFold kv f (k, a)
445449
446450 extract (Tuple' kv x) = return (Prelude. mapM f kv, x)
@@ -500,7 +504,7 @@ demux = demuxGeneric
500504{-# INLINE demuxUsingMap #-}
501505demuxUsingMap :: (Monad m , Ord k ) =>
502506 (a -> k )
503- -> (k -> m (Fold m a b ))
507+ -> (k -> m (Maybe ( Fold m a b ) ))
504508 -> Scanl m a (m (Map k b ), Maybe (k , b ))
505509demuxUsingMap = demuxScanGeneric
506510
@@ -512,7 +516,7 @@ demuxUsingMap = demuxScanGeneric
512516{-# INLINE demuxScan #-}
513517demuxScan :: (Monad m , Ord k ) =>
514518 (a -> k )
515- -> (k -> m (Fold m a b ))
519+ -> (k -> m (Maybe ( Fold m a b ) ))
516520 -> Scanl m a (Maybe (k , b ))
517521demuxScan getKey = fmap snd . demuxUsingMap getKey
518522
@@ -601,7 +605,7 @@ demuxGenericIO getKey getFold =
601605{-# INLINE demuxerToContainerIO #-}
602606demuxerToContainerIO :: (MonadIO m , IsMap f , Traversable f ) =>
603607 (a -> Key f )
604- -> (Key f -> m (Fold m a b ))
608+ -> (Key f -> m (Maybe ( Fold m a b ) ))
605609 -> Fold m a (f b )
606610demuxerToContainerIO getKey getFold =
607611 Fold (\ s a -> Partial <$> step s a) (Partial <$> initial) undefined final
@@ -647,8 +651,10 @@ demuxerToContainerIO getKey getFold =
647651 let k = getKey a
648652 case IsMap. mapLookup k kv of
649653 Nothing -> do
650- f <- getFold k
651- initFold kv kv1 f (k, a)
654+ res <- getFold k
655+ case res of
656+ Nothing -> pure $ Tuple' kv kv1
657+ Just f -> initFold kv kv1 f (k, a)
652658 Just ref -> do
653659 f <- liftIO $ readIORef ref
654660 runFold kv kv1 ref f (k, a)
@@ -675,7 +681,7 @@ demuxerToContainerIO getKey getFold =
675681{-# INLINE demuxScanGenericIO #-}
676682demuxScanGenericIO :: (MonadIO m , IsMap f , Traversable f ) =>
677683 (a -> Key f )
678- -> (Key f -> m (Fold m a b ))
684+ -> (Key f -> m (Maybe ( Fold m a b ) ))
679685 -> Scanl m a (m (f b ), Maybe (Key f , b ))
680686demuxScanGenericIO getKey getFold =
681687 Scanl (\ s a -> Partial <$> step s a) (Partial <$> initial) extract final
@@ -721,8 +727,10 @@ demuxScanGenericIO getKey getFold =
721727 let k = getKey a
722728 case IsMap. mapLookup k kv of
723729 Nothing -> do
724- f <- getFold k
725- initFold kv f (k, a)
730+ res <- getFold k
731+ case res of
732+ Nothing -> pure $ Tuple' kv Nothing
733+ Just f -> initFold kv f (k, a)
726734 Just ref -> do
727735 f <- liftIO $ readIORef ref
728736 runFold kv ref f (k, a)
@@ -766,7 +774,7 @@ demuxIO = demuxGenericIO
766774{-# INLINE demuxUsingMapIO #-}
767775demuxUsingMapIO :: (MonadIO m , Ord k ) =>
768776 (a -> k )
769- -> (k -> m (Fold m a b ))
777+ -> (k -> m (Maybe ( Fold m a b ) ))
770778 -> Scanl m a (m (Map k b ), Maybe (k , b ))
771779demuxUsingMapIO = demuxScanGenericIO
772780
@@ -779,7 +787,7 @@ demuxUsingMapIO = demuxScanGenericIO
779787{-# INLINE demuxScanIO #-}
780788demuxScanIO :: (MonadIO m , Ord k ) =>
781789 (a -> k )
782- -> (k -> m (Fold m a b ))
790+ -> (k -> m (Maybe ( Fold m a b ) ))
783791 -> Scanl m a (Maybe (k , b ))
784792demuxScanIO getKey = fmap snd . demuxUsingMapIO getKey
785793
@@ -839,7 +847,7 @@ demuxToMap = demuxToContainer
839847--
840848{-# INLINE demuxerToMap #-}
841849demuxerToMap :: (Monad m , Ord k ) =>
842- (a -> k ) -> (k -> m (Fold m a b )) -> Fold m a (Map k b )
850+ (a -> k ) -> (k -> m (Maybe ( Fold m a b ) )) -> Fold m a (Map k b )
843851demuxerToMap = demuxerToContainer
844852
845853{-# DEPRECATED demuxToContainerIO "Use demuxerToContainerIO instead" #-}
@@ -869,13 +877,13 @@ demuxToMapIO = demuxToContainerIO
869877--
870878{-# INLINE demuxerToMapIO #-}
871879demuxerToMapIO :: (MonadIO m , Ord k ) =>
872- (a -> k ) -> (k -> m (Fold m a b )) -> Fold m a (Map k b )
880+ (a -> k ) -> (k -> m (Maybe ( Fold m a b ) )) -> Fold m a (Map k b )
873881demuxerToMapIO = demuxerToContainerIO
874882
875883{-# INLINE demuxKvToContainer #-}
876884demuxKvToContainer :: (Monad m , IsMap f , Traversable f ) =>
877- (Key f -> m (Fold m a b )) -> Fold m (Key f , a ) (f b )
878- demuxKvToContainer f = demuxerToContainer fst (fmap (lmap snd ) . f)
885+ (Key f -> m (Maybe ( Fold m a b ) )) -> Fold m (Key f , a ) (f b )
886+ demuxKvToContainer f = demuxerToContainer fst (fmap (fmap ( lmap snd ) ) . f)
879887
880888-- | Fold a stream of key value pairs using a function that maps keys to folds.
881889--
@@ -887,8 +895,8 @@ demuxKvToContainer f = demuxerToContainer fst (fmap (lmap snd) . f)
887895--
888896-- >>> import Data.Map (Map)
889897-- >>> :{
890- -- let f "SUM" = return Fold.sum
891- -- f _ = return Fold.product
898+ -- let f "SUM" = return (Just Fold.sum)
899+ -- f _ = return (Just Fold.product)
892900-- input = Stream.fromList [("SUM",1),("PRODUCT",2),("SUM",3),("PRODUCT",4)]
893901-- in Stream.fold (Fold.demuxKvToMap f) input :: IO (Map String Int)
894902-- :}
@@ -897,7 +905,7 @@ demuxKvToContainer f = demuxerToContainer fst (fmap (lmap snd) . f)
897905-- /Pre-release/
898906{-# INLINE demuxKvToMap #-}
899907demuxKvToMap :: (Monad m , Ord k ) =>
900- (k -> m (Fold m a b )) -> Fold m (k , a ) (Map k b )
908+ (k -> m (Maybe ( Fold m a b ) )) -> Fold m (k , a ) (Map k b )
901909demuxKvToMap = demuxKvToContainer
902910
903911------------------------------------------------------------------------------
0 commit comments