@@ -505,10 +505,13 @@ module Streamly.Internal.Data.Stream.IsStream
505 , runStateT
505 , runStateT
507 -- * Maybe Streams
507 -- * Maybe Streams
508 , mapMaybe
509 , mapMaybe
509 , mapMaybeM
510 , mapMaybeM
511 -- * Either Streams
512 -- * Either Streams
512 , iterateMapLeftsWith
515 , iterateMapLeftsWith
514 -- * Diagnostics
517 -- * Diagnostics
@@ -538,12 +541,14 @@ import Control.Monad.Trans.Reader (ReaderT)
538import Control.Monad.Trans.State.Strict (StateT)
541import Control.Monad.Trans.State.Strict (StateT)
539import Control.Monad.Trans.Class (MonadTrans(..))
542import Control.Monad.Trans.Class (MonadTrans(..))
540import Control.Monad.Trans.Control (MonadBaseControl)
543import Control.Monad.Trans.Control (MonadBaseControl)
544+import Data.Either (isLeft, isRight)
541import Data.Functor.Identity (Identity (..))
545import Data.Functor.Identity (Identity (..))
542import Data.Kind (Type)
546import Data.Kind (Type)
543import Data.Heap (Entry(..))
547import Data.Heap (Entry(..))
544import Data.Maybe (isJust, fromJust, isNothing)
548import Data.Maybe (isJust, fromJust, isNothing)
545import Data.Void (Void)
549import Data.Void (Void)
546import Foreign.Storable (Storable)
550import Foreign.Storable (Storable)
551+import Streamly.Internal.BaseCompat (fromLeft, fromRight)
547import Streamly.Internal.Data.Stream.Enumeration
552import Streamly.Internal.Data.Stream.Enumeration
548 (Enumerable(..), enumerate, enumerateTo)
553 (Enumerable(..), enumerate, enumerateTo)
549import Streamly.Internal.Data.Fold.Types (Fold (..), Fold2 (..))
554import Streamly.Internal.Data.Fold.Types (Fold (..), Fold2 (..))
@@ -2563,6 +2568,13 @@ mapMaybeM f = fmap fromJust . filter isJust . K.mapM f
2563mapMaybeMSerial :: Monad m => (a -> m (Maybe b)) -> SerialT m a -> SerialT m b
2568mapMaybeMSerial :: Monad m => (a -> m (Maybe b)) -> SerialT m a -> SerialT m b
2564mapMaybeMSerial f m = fromStreamD $ D.mapMaybeM f $ toStreamD m
2569mapMaybeMSerial f m = fromStreamD $ D.mapMaybeM f $ toStreamD m
2571+-- | In a stream of 'Maybe's, discard 'Nothing's and unwrap 'Just's.
2575+catMaybes :: (IsStream t, Monad m, Functor (t m)) => t m (Maybe a) -> t m a
2576+catMaybes = fmap fromJust . filter isJust
2566------------------------------------------------------------------------------
2578------------------------------------------------------------------------------
2567-- Transformation by Reordering
2579-- Transformation by Reordering
2568------------------------------------------------------------------------------
2580------------------------------------------------------------------------------
@@ -3496,6 +3508,20 @@ iterateSmapMWith combine f initial stream =
3496-- Either streams
3508-- Either streams
3497------------------------------------------------------------------------------
3509------------------------------------------------------------------------------
3511+-- | Discard 'Right's and unwrap 'Left's in an 'Either' stream.
3515+lefts :: (IsStream t, Monad m, Functor (t m)) => t m (Either a b) -> t m a
3516+lefts = fmap (fromLeft undefined) . filter isLeft
3518+-- | Discard 'Left's and unwrap 'Right's in an 'Either' stream.
3522+rights :: (IsStream t, Monad m, Functor (t m)) => t m (Either a b) -> t m b
3523+rights = fmap (fromRight undefined) . filter isRight
3499-- | In an 'Either' stream iterate on 'Left's. This is a special case of
3525-- | In an 'Either' stream iterate on 'Left's. This is a special case of
3500-- 'iterateMapWith':
3526-- 'iterateMapWith':